Skip to content

游戏运行时系统概览:网络、动画与物理 ​

游戏运行时通常把世界状态、网络同步、动画表现和物理计算拆成不同系统,再通过明确的数据边界连接起来。本篇只保留整体流程和关键概念。

一、网络同步 ​

实时网络应用需要在延迟、丢包和不同设备性能下,尽量让各端看到一致的世界状态。常见思路是服务器维护权威状态,客户端负责输入、预测和表现。

状态同步与帧同步 ​

text
状态同步:服务器发送“结果是什么”
帧同步:服务器发送“玩家做了什么”,各端根据输入模拟结果

状态同步直接传输对象位置、世界状态等结果,客户端主要负责显示和插值;帧同步主要传输输入,要求各端模拟逻辑更加一致。

实际系统可以混合使用,关键是明确:

  • 哪些状态由服务器最终决定;
  • 哪些输入由客户端提交;
  • 哪些结果必须可靠到达;
  • 断线、重连和校正如何处理。

TCP 与 UDP ​

TCP 提供可靠、有序的字节流,适合登录、账号、商城、聊天和资源下载等必须完整到达的数据。丢包时,TCP 可能等待旧数据,造成队头阻塞。

UDP 不保证到达和顺序,但应用可以自己决定可靠性策略。高频位置通常采用“最新状态优先”,旧包丢失后不必等待;关键事件和状态切换则需要确认或重传。

因此重点不是“TCP 或 UDP 谁更快”,而是判断:

这条消息丢失后,旧数据还有价值吗?是否必须等待?最终结果由谁确认?

预测、校正与插值 ​

本地玩家的输入已经被客户端知道,可以先立即预测:

text
本地输入
    ├── 立即更新本地表现
    └── 发送给服务器

服务器返回权威状态后,客户端比较差异并进行校正。远端玩家的下一步输入未知,通常不直接预测,而是在两个已知服务器状态之间插值,以减少抖动。

Tick 与固定时间步 ​

渲染帧率可能是 30、60 或 120 FPS,但游戏逻辑和物理通常使用固定 Tick:

text
Tick 100 → Tick 101 → Tick 102 → Tick 103

输入、状态快照和校正都可以带 Tick 编号,用来处理乱序、重复和重放。固定时间步让模拟节奏稳定,同时允许渲染以另一种频率运行。

二、骨骼动画 ​

骨骼动画由骨骼层级和 Mesh 组成。骨骼保存层级关系与姿态,Mesh 顶点根据一个或多个骨骼的影响权重进行蒙皮。

基本动画管线 ​

text
游戏状态
    ↓
选择动画状态
    ↓
采样 Animation Clip
    ↓
混合多个姿态
    ↓
IK 等局部修正
    ↓
生成骨骼矩阵
    ↓
蒙皮并绘制 Mesh

例如,角色速度增加时从 Idle 切换到 Run,用户触发技能动作时从 Run 过渡到 Action。

状态机与动画混合 ​

状态机回答“当前应该播放什么动画、何时切换”。混合则避免状态切换时突然跳变:

text
Run Pose × (1 - weight)
+ Shoot Pose × weight

weight 在一段时间内从 0 变化到 1,角色就能从跑步自然过渡到目标动作。

IK 与移动控制 ​

普通动画提供基础姿态,IK 根据当前环境修正局部骨骼,例如让脚贴合地面、让手对准物体、让手脚接触目标。

角色移动可以由代码控制,也可以由动画的 Root Motion 控制。代码控制更容易与网络和物理结合;Root Motion 更容易保持特定动作与位移的一致。实际项目可能混合使用。

游戏逻辑负责动作是否成功、对象速度和权威位置;动画系统主要负责抬腿、转身、过渡等表现。

三、物理管线 ​

物理系统通常按照下面的顺序工作:

text
积分更新
    ↓
Broad Phase 粗检测
    ↓
Narrow Phase 精检测
    ↓
Solver 求解碰撞和约束
    ↓
输出位置、速度和碰撞事件

粗检测与精检测 ​

粗检测使用 AABB、空间网格或层次包围盒,快速找出可能相交的物体对。精检测再计算真实的碰撞点、法线和穿透深度。

渲染 Mesh 可以很复杂,但 Collider 通常使用球体、盒体、胶囊体等简单形状,以降低计算成本。

检测与响应 ​

碰撞检测回答:

两个物体是否发生接触?接触信息是什么?

碰撞响应回答:

接触后如何修改位置和速度?是否反弹、摩擦或被推出?

Trigger 只产生进入、离开等事件,不产生实体阻挡;普通 Collision 会参与物理响应。

固定时间步与高速物体 ​

物理通常使用固定时间步,以避免不同帧率导致模拟结果明显变化。如果高速物体移动得很快,可能从障碍物前面直接跳到障碍物后面,离散检测就会漏掉碰撞。这种穿透问题可以用更小的时间步、连续碰撞检测或扫掠检测处理。

四、系统之间如何连接 ​

一个简化的运行时流程如下:

text
网络输入
    ↓
游戏逻辑更新世界状态
    ├── 物理计算位置和碰撞
    ├── 动画系统生成角色姿态
    └── 生成 Render Snapshot
              ↓
        渲染线程消费只读快照

游戏线程不必让渲染线程直接读取正在修改的世界对象,而是生成稳定的渲染快照。这样可以减少跨线程锁,也避免渲染线程看到更新一半的数据。

本篇结论 ​

  1. 网络同步的核心是服务器权威、客户端预测、状态校正和远端插值。
  2. TCP 适合可靠业务数据,UDP 适合由应用自行决定可靠性的实时数据。
  3. Tick 是游戏逻辑的时间单位,固定时间步让模拟更稳定。
  4. 动画管线通常是状态选择、采样、混合、IK、骨骼矩阵和蒙皮。
  5. 物理管线通常是积分、粗检测、精检测、求解和输出。
  6. 游戏逻辑负责权威状态,动画和渲染主要负责表现,系统之间通过快照或明确的数据边界连接。

← 上一章:Atomic、内存序与任务系统 · 返回学习地图