一秒记住【笔趣阁】biquge843.com,更新快,无弹窗!
第2373章网络同步与“提前量”的战争(第1/2页)
李轩听到FPS项目网络同步要求的时候,脸上的表情确实像被塞了一整个柠檬。
他把那份需求文档翻到第三页,目光停在“命中判定误差需控制在50毫秒以内”那行字上,看了很久,然后把文档合上放在桌面上。
“梁总,50毫秒。”他抬起头看着站在他办公桌对面的梁永琪,声音比平时慢了一些,“我们现有的网络架构,从客户端输入到服务器响应再广播回所有客户端的完整链路,延迟在200毫秒级别。
传奇、大话、梦幻、奇迹,这些游戏都能接受这个延迟,因为玩家放技能之前有读条,有前摇,有动画过渡,多等两百毫秒他感觉不出来。
但FPS不行。
FPS里玩家按下鼠标左键的那一瞬间,子弹就该飞出去,打在敌人身上就该掉血。
如果这个反馈晚了两百毫秒,玩家会觉得枪卡了。”
梁永琪靠在门框上,两只手插在外套口袋里。
“我知道。
所以这个项目你得把网络架构从头改一遍。”
李轩把两只手交叉着搁在桌面上,视线落在键盘边缘的某个点上,像在脑子里拆解一条一条的链路。
“从200毫秒压到50毫秒,等于要把整条链路上每一个环节的延迟都砍掉四分之三。
客户端渲染管线的反馈延迟要压缩,服务器端的输入处理队列要重做,网络传输层的协议要优化。
光是这些还不够,最麻烦的是物理距离——华东的玩家连到上海的服务器,光在光纤里跑一个来回就要几十毫秒,华南的玩家延迟更高,华北的玩家还要再加一截。
物理距离带来的延迟是绕不过去的。”
梁永琪当天晚上回到陈园的时候把李轩的这段话原原本本地转述给了陈浩。
陈浩坐在沙发上听完,手指在膝盖上轻轻叩了两下,然后他从茶几下面抽出一张白纸,在上面画了两条横向的箭头。
上面那条箭头从左到右标注了“客户端输入→服务器”,下面那条标注了“服务器→客户端广播”。
(本章未完,请点击下一页继续阅读)第2373章网络同步与“提前量”的战争(第2/2页)
他在两条箭头的中间画了一个方框,方框里写了四个字:“预判+校验”。
“告诉李轩,用‘客户端预判+服务器校验’的模式。
客户端先让玩家看到命中的特效,子弹打出去的那一瞬间屏幕上就弹反馈,不等服务器确认。
然后服务器在后台做最终裁定,如果服务器判定命中,那就没事;如果服务器判定没命中,客户端再把这个反馈撤回来,但误差窗口控制在几十毫秒以内,玩家感觉不出来。”
梁永琪把这段话记在手机备忘录里,第二天上午转述给李轩的时候,李轩听完之后沉默了很久。
他坐在椅子上,两只手交叉着搁在腹部,视线落在天花板上,嘴唇动了动像在默算什么东西。
“浩哥这个思路是行业顶级的。”他终于开口了,声音比刚才低了一些,“客户端先反馈,服务器后校验,把玩家的感知延迟压到最低,实际的数据一致性用服务器兜底。
但这个‘假命中’需要极其精细的补偿算法,客户端预判的时机和服务器校验的窗口要卡得非常准。
如果客户端的预判和服务器校验的结果差得太多,就会出现一种最恶心的BUg——玩家明明看到自己打中了,屏幕上弹了命中特效,敌人身上也飙了血,但两秒钟之后服务器说‘没打中’,那个敌人又满血站起来了。
玩家会骂死我们。”
“那就把补偿算法做到不差太多。”梁永琪说。
技术团队在接下来的三周里几乎住在了机房。
李轩带着两个网络方向的程序员把客户端预判模块和服务器校验模块拆开重写了一遍,在两者之间加了一层补偿缓冲区,缓冲区的窗口大小根据实时网络延迟动态调整。
第一版延迟补偿算法跑通的那天晚上,李轩在模拟环境里把网络延迟设到了200毫秒,开枪打一个移动目标,屏幕上弹出了命中反馈,服务器校验的结果在缓冲区窗口内追了上来,确认了命中。
【跪求礼物,免费的为爱发电也行!】