游戏运行时系统概览:网络、动画与物理
游戏运行时通常把世界状态、网络同步、动画表现和物理计算拆成不同系统,再通过明确的数据边界连接起来。本篇只保留整体流程和关键概念。
一、网络同步
实时网络应用需要在延迟、丢包和不同设备性能下,尽量让各端看到一致的世界状态。常见思路是服务器维护权威状态,客户端负责输入、预测和表现。
状态同步与帧同步
状态同步:服务器发送“结果是什么”
帧同步:服务器发送“玩家做了什么”,各端根据输入模拟结果状态同步直接传输对象位置、世界状态等结果,客户端主要负责显示和插值;帧同步主要传输输入,要求各端模拟逻辑更加一致。
实际系统可以混合使用,关键是明确:
- 哪些状态由服务器最终决定;
- 哪些输入由客户端提交;
- 哪些结果必须可靠到达;
- 断线、重连和校正如何处理。
TCP 与 UDP
TCP 提供可靠、有序的字节流,适合登录、账号、商城、聊天和资源下载等必须完整到达的数据。丢包时,TCP 可能等待旧数据,造成队头阻塞。
UDP 不保证到达和顺序,但应用可以自己决定可靠性策略。高频位置通常采用“最新状态优先”,旧包丢失后不必等待;关键事件和状态切换则需要确认或重传。
因此重点不是“TCP 或 UDP 谁更快”,而是判断:
这条消息丢失后,旧数据还有价值吗?是否必须等待?最终结果由谁确认?
预测、校正与插值
本地玩家的输入已经被客户端知道,可以先立即预测:
本地输入
├── 立即更新本地表现
└── 发送给服务器服务器返回权威状态后,客户端比较差异并进行校正。远端玩家的下一步输入未知,通常不直接预测,而是在两个已知服务器状态之间插值,以减少抖动。
Tick 与固定时间步
渲染帧率可能是 30、60 或 120 FPS,但游戏逻辑和物理通常使用固定 Tick:
Tick 100 → Tick 101 → Tick 102 → Tick 103输入、状态快照和校正都可以带 Tick 编号,用来处理乱序、重复和重放。固定时间步让模拟节奏稳定,同时允许渲染以另一种频率运行。
二、骨骼动画
骨骼动画由骨骼层级和 Mesh 组成。骨骼保存层级关系与姿态,Mesh 顶点根据一个或多个骨骼的影响权重进行蒙皮。
基本动画管线
游戏状态
↓
选择动画状态
↓
采样 Animation Clip
↓
混合多个姿态
↓
IK 等局部修正
↓
生成骨骼矩阵
↓
蒙皮并绘制 Mesh例如,角色速度增加时从 Idle 切换到 Run,用户触发技能动作时从 Run 过渡到 Action。
状态机与动画混合
状态机回答“当前应该播放什么动画、何时切换”。混合则避免状态切换时突然跳变:
Run Pose × (1 - weight)
+ Shoot Pose × weightweight 在一段时间内从 0 变化到 1,角色就能从跑步自然过渡到目标动作。
IK 与移动控制
普通动画提供基础姿态,IK 根据当前环境修正局部骨骼,例如让脚贴合地面、让手对准物体、让手脚接触目标。
角色移动可以由代码控制,也可以由动画的 Root Motion 控制。代码控制更容易与网络和物理结合;Root Motion 更容易保持特定动作与位移的一致。实际项目可能混合使用。
游戏逻辑负责动作是否成功、对象速度和权威位置;动画系统主要负责抬腿、转身、过渡等表现。
三、物理管线
物理系统通常按照下面的顺序工作:
积分更新
↓
Broad Phase 粗检测
↓
Narrow Phase 精检测
↓
Solver 求解碰撞和约束
↓
输出位置、速度和碰撞事件粗检测与精检测
粗检测使用 AABB、空间网格或层次包围盒,快速找出可能相交的物体对。精检测再计算真实的碰撞点、法线和穿透深度。
渲染 Mesh 可以很复杂,但 Collider 通常使用球体、盒体、胶囊体等简单形状,以降低计算成本。
检测与响应
碰撞检测回答:
两个物体是否发生接触?接触信息是什么?
碰撞响应回答:
接触后如何修改位置和速度?是否反弹、摩擦或被推出?
Trigger 只产生进入、离开等事件,不产生实体阻挡;普通 Collision 会参与物理响应。
固定时间步与高速物体
物理通常使用固定时间步,以避免不同帧率导致模拟结果明显变化。如果高速物体移动得很快,可能从障碍物前面直接跳到障碍物后面,离散检测就会漏掉碰撞。这种穿透问题可以用更小的时间步、连续碰撞检测或扫掠检测处理。
四、系统之间如何连接
一个简化的运行时流程如下:
网络输入
↓
游戏逻辑更新世界状态
├── 物理计算位置和碰撞
├── 动画系统生成角色姿态
└── 生成 Render Snapshot
↓
渲染线程消费只读快照游戏线程不必让渲染线程直接读取正在修改的世界对象,而是生成稳定的渲染快照。这样可以减少跨线程锁,也避免渲染线程看到更新一半的数据。
本篇结论
- 网络同步的核心是服务器权威、客户端预测、状态校正和远端插值。
- TCP 适合可靠业务数据,UDP 适合由应用自行决定可靠性的实时数据。
- Tick 是游戏逻辑的时间单位,固定时间步让模拟更稳定。
- 动画管线通常是状态选择、采样、混合、IK、骨骼矩阵和蒙皮。
- 物理管线通常是积分、粗检测、精检测、求解和输出。
- 游戏逻辑负责权威状态,动画和渲染主要负责表现,系统之间通过快照或明确的数据边界连接。
