整体概述请参见:http://dreamyouxi.com:7129/blog/611

本文阐述针对网络延迟的处理方案,重点聚焦于弹道模拟部分。

FPS 的射击体验取舍

FPS 游戏通常优先照顾射击者的体验。实际游戏中,开枪者看到命中基本就是命中;而被命中的人有时会莫名其妙地死掉。这是这种设计取舍的直接后果,可以通过一些视觉欺骗手法来缓和这种矛盾。

延迟补偿的原理

客户端开枪后,为了保证操作及时响应,会立刻进行本地模拟。而由于网络延迟的存在,开枪消息需要经过一段时间才能到达服务器。开枪客户端所看到的远端玩家,是从服务器同步过来并经过插值计算的结果,且还存在一定的帧数差。因此,服务器需要尽可能还原出射击客户端那一刻的视角,这样模拟出来的结果才能尽可能贴近玩家真实看到的画面。

要还原客户端视角,逻辑上需要执行与客户端相同的插值计算,并综合考虑网络延迟以及异步跨帧带来的毫秒级延迟。为此,服务器除了计算之外,还需要记录历史位置信息,以便在模拟时能快速还原出客户端看到的那一刻——典型的以空间换时间。

这种做法有一个正统的名字:延迟补偿。但放到实时弹道模拟的场景下,代价就相当大了。

性能开销分析

在实时弹道模拟中,每颗子弹的每一步都需要对目标玩家和开枪者分别做一次还原计算。实测数据显示,由于这个操作,整体 CPU 消耗占比高达 81%,CPU 开销增加了 4 倍以上。

这部分开销中,最大的瓶颈是将位置信息写入物理引擎,这一步占了大头。

去掉服务器模拟验证的收益

如果去掉服务器执行模拟验证的设计思路,服务器成本将大幅降低。

实测在整机低负载(10% 以下)的情况下,综合单核平均性能可支撑 700 人(CPU 使用率 0.98%),满单核使用率时最大可达 1050 人。