为了平衡负载,减轻主线程压力,对于一些表现层的物理模拟我们放在另一个线程异步更新。有人说,让GPU干物理的活不行吗?像Physx一样。实话说,现在的游戏GPU的负担已经很重了,放在GPU运算必定导致FPS下降。而CPU的负载一般集中在一个核心,因为游戏系统的特殊性,各个模块的依赖比较紧密,每一步都需要上一步的结果,所以不容易做多线程。但是对于某些不参与游戏逻辑的效果,完全是可以异步更新的,某些粒子效果啊,视觉的物理效果啊…
如何实现
图片来源:https://www.gameres.com/484680.html
异步更新的好处是可以用逻辑更新和渲染更新的时间做多线程模拟(T1 + T2时间段),降低表现物理层的模拟时间,这个方案会导致渲染层晚一帧得到物理模拟结果。但是,如果物理对象的模拟数据需要拿去做逻辑更新,那么还是需要使用同步模拟机制,否则会增大系统的复杂性。
实例
在战地1中,我估计残骸和布娃娃是纯客户端的异步模拟。某个房屋被打碎了,在服务端应该就是简单地移除这个游戏对象,然后发一条消息给客户端通知这个房屋碎了,客户端生成纯客户端可见的房屋残骸,进行异步物理模拟。
如何看出来的呢?因为可破坏的物体被破坏后玩家和被破坏的物体就不再有碰撞了。
生成的残骸是阻挡不了玩家的移动的,玩家也不能站到上面;残骸还能被玩家推着走,证明了这是纯客户端的游戏对象。(即使不是,这些特性使他完全可以作为纯客户端游戏对象,支持异步模拟)