StickEngine-架构3-FPS游戏的弹道延迟处理
整体概述是 http://dreamyouxi.com:7129/blog/611
该篇阐述针对网络延迟的处理(主要是弹道模拟)。
FPS中,更会照顾射击者的体验,在实际体验中,开枪者看到命中了 基本都是命中,而被命中的人有时候会莫名其妙的死掉,这个只是这种做法的后果,可以通过一些欺骗的手法缓和这种矛盾。
现在来看一下过程:
客户端开枪后为了操作良好的额及时性体验,会立刻进行本地模拟,在服务器中 由于延迟的存在,会延后一定的时间才会到达服务器,开枪的客户端看到的remote玩家 是从服务器同步过来并且插值计算的结果(并且还存在一定的帧数差),因此对于服务器来说,要尽可能还原出 射击的客户端的视角,这样模拟出来的才尽可能贴近玩家真是看到的东西。
要还原客户端看到的视角,逻辑上,要进行和客户端一样的插值计算,还有考虑网络延迟,和异步跨帧带来的延迟(帧数毫秒级别),因此除了计算服务器还要记录历史信息,用于在模拟时,快速还原出客户端看到的那一刻(空间换时间)。
而这个做法有一个很正统的名字-延迟补偿,但放到了模拟的情况下,这个代价就有有点大了。
在时时模拟的弹道计算中,每颗子弹的模拟都要计算一次相对目标玩家和开枪者的计算。
实际测试下来的数值,因为这个操作,整体CPU消耗会占比81% ,因为这个操作,CPU开销会增加4倍以上。
而这部分开销中,最主要的开始把位置信息输入到物理引擎中,这个操作占大头。
如果,去掉服务器进行模拟的验证指导思想,那么服务器成本将会大幅降低。
实测在整机低负载(10%以下),综合单核平均性能是700人 (0.98%使用率 ,满单核使用率最大值可达1050人 )