ARTICLE · 1071707
开发者日志第九期&性能问题专项说明
各位猎金人大家好,本期是开发者日志第九期。我们想对大家近期反馈最多的基础游戏体验&双端性能问题进行一次集中说明。首先明确当前的问题,然后说明已经完成的优化和后续的优化方向。为了把相关问题说清楚,难以避免要引入一些较为复杂技术概念,请大家多多包涵。
1. 当前问题说明
1.1 丢伤害&伤害预测错误
当前我们的伤害判定以游戏服务器为准,但由于必定存在的网络延迟,如果等待服务器返回判定结果后再播放命中表现,动作游戏最为重要的打击感就会变得迟滞。为了让战斗打击感更加流畅,目前我们在设置中默认开启了客户端伤害预测(即发起攻击时,运行在你本地的游戏客户端,会在获取服务器最终结果之前,根据自身的预测结果,播放喷溅、命中音效等命中表现)。
由于网络延迟,客户端和服务器之间永远存在不一致。因此偶尔会出现这样的情况:你的客户端画面先提前播放了命中表现,但后续服务器判定这一下其实根本没打中,于是对方不会掉血、也不会有受击硬直。表现上很像伤害丢失了,但其实本质上是本次的客户端伤害预测出错了。有2种常见情况:
服务器判定对方此刻已经移出了你的攻击范围,但因为网络延迟,在你的客户端看来,对方还站在攻击范围内,于是抢先播放了命中表现。
闪避过程中有一小段无敌帧。服务器判定对方恰好用无敌帧躲过了你这一击,但因为网络延迟,在你的客户端看来,命中时对方并不处于无敌帧下,于是抢先播放了命中表现。
同时,为了与干净利落的动作表现吻合,很多技能的攻击判定时间总体较短,比如剑盾第一段攻击的判定时间全程仅62ms。这类快速攻击由于判定时间较短,对客户端和服务器不同步问题的宽容度天然更低,在敌方进行闪避或快速位移时,就更加容易出现预测错误。
在游戏设置中关闭客户端伤害预测,可以避免上述的客户端预测错误的问题,但可能会导致打击感迟滞。为了方便大家理解,我们制作了1个视频,更直观的演示上述问题:
究竟是信任客户端还是服务器,是一个鱼和熊掌不可兼得的难题。如果我们在伤害判定上更加信任客户端,那确实攻击方手感会更好,伤害预测错误的问题将大幅缓解。但当攻击方高延迟导致的双端不同步问题发生时,受击方的游戏体验就会受损,从而破坏双方博弈的公平性。且更加信任客户端还会使外挂的可篡改空间大幅提升,会导致出现暴力外挂。为了保证攻击方与受击方体验的公平性和更高的反外挂安全性,最终我们选择了伤害判定以服务器为准的方案。
1.2 丢闪避&丢技能
放了闪避,明明都闪出去了,但突然又被拉回原地挨打,我们也收到了非常多这类丢闪避的问题反馈。
目前的游戏机制是:只要摁下闪避按键,本地客户端会立即尝试执行闪避&播放闪避动作,但该指令实际还需要经过上行网络延迟(本地客户端发送信息到服务器花费的时间)才能被真的发送至服务器,并在服务器上得到执行。
所以发生该问题的第1种可能情况是:摁下闪避按键的一瞬间,在本地客户端看来,你并没有受击,可以正常执行闪避,所以立刻播放了闪避动作。但当指令经过上行网络延迟发送至服务器时,在此时此刻的服务器上,你已经被攻击命中了,无法执行闪避。当服务器把这一刻被攻击命中的状态回传给你本地的客户端时,因为状态判定均以服务器为准的机制,你就被拉回了原地并进入受击状态。
还有1种可能性是,在你摁下闪避按键的瞬间,在服务器上其实你已经被攻击命中了,但由于下行网络延迟(服务器发送信息到你本地客户端花费的时间),你本地的客户端此时仍未收到服务器消息,在本地客户端看来,此时仍可以正常执行闪避。而后就会和前文一样的丢闪避问题。
其实除了闪避指令之外,游戏中的各种技能,都可能因为上述的网络延迟带来的双端状态不同步问题,而出现客户端先播放表现而后又被服务器拉回的现象。
1.3 服务器运算延迟
为了提供足够真实、细腻的动作游戏体验,游戏服务器需要完全运行每个角色和怪物的动画和IK等细节,确保全部受击盒(头、躯干、上臂、下臂、大腿、小腿)的位置始终准确,这些计算工作产生了极大的性能负担。
理想情况下,游戏服务器始终以稳定的帧率运行,只会产生极低的服务器本身的运算延迟,不会对大家实际游玩的总延迟感受造成明显的影响。但当一个副本中同时发生多场战斗或进行一些复杂行为的时候,服务器帧率会出现短时下降,从而导致服务器延迟变高,骤然升高的延迟会提高上文提到的各类问题出现的概率,对大家的游玩体验造成负面影响。
目前从监控指标看,布兰德要塞发生服务器帧率下降的概率比神木林更高,与社区的大家跟我们反馈的现象也是一致的。这主要是因为要塞的怪物数量更多、密度更大,平均性能开销更高。
2. 正式发售后已优化内容
2.1 拆分伤害预测碰撞盒
如之前在社区中说明该问题时提到的,我们已经在近期优化了部分预测策略:原本客户端伤害预测是直接使用技能本身的伤害判定碰撞盒(下图中的红色碰撞盒),但我们现在为客户端伤害预测独立配置了1个稍小一些的碰撞盒(下图中的黄色碰撞盒)。通过执行更严格的预测,来减少由于客户端与服务器位置不同步导致的预测错误。

2.2 服务器性能优化
从正式发售至今,我们也一直持续在通过多种方式来进行服务器性能优化,并保证运行的稳定性:
针对偶发的DDOS攻击(短期大量不同IP的UDP包向我们的服务器发送消息),我们开启了云服务器的高防来应对攻击。
通过将AWS服务器的存储从EFS切换为EBS,解决偶现的长达几秒的超长卡顿。
通过调整配置,避免云服务器超线程运行,来规避超线程运行时偶现的卡顿。
通过日志批量提交,异步写入,来减少日志记录和上报产生的性能开销。
通过更加智能的怪物行为控制,在周围无玩家的时候降低怪物的性能开销。
通过对同时多只怪物刷新等复杂逻辑,进行分散在多帧分批处理的方式,避免在单帧中进行大量的计算。
对随机掉落物生成等涉及复杂计算逻辑的行为,进行专项性能优化,降低性能开销。
如前文提到的,服务器高延迟会直接对大家的游玩体验造成负面影响,所以我们以服务器单帧延迟大于50ms的百分比为最核心的监控指标。下面的2张图分别是三人模式的神木林和布兰德要塞的近期数据走势:


2.3 技能同步机制
通过对大家的反馈的排查,我们发现技能同步机制对网络波动的处理确实有不够完善的地方。在上周的更新中,我们已经进行了一轮集中修复:
对各职业的闪避后派生攻击,增加了更多的网络波动容错处理,降低了因网络延迟产生位置拉扯,从而导致闪避后派生攻击施放失败的概率。

修复了在受到【灾刃狂舞】这类连续快速攻击时,二击脱离及一些可在二击脱离窗口期施放的技能,在客户端被打断、但服务端仍在播放导致角色位置拉扯的问题。


优化了闪避方向的同步机制,提高闪避方向同步的准确性,降低敌方闪避朝向显示错误然后又发生瞬移或拉扯的概率。
3. 后续优化计划
3.1 服务器性能优化
目前我们正在持续优化战斗细节的性能开销,来进一步减少低帧发生的频率。具体来说,会通过把蓝图脚本的逻辑迁移到C++等手段来减少性能开销。相关优化工作完成后会陆续上线,请大家关注后续更新公告。
我们也在和AWS等云服务厂商一起测试更高型号的CPU,直接从硬件层面提高服务器的性能。目前已经在压力测试、收集数据的阶段,测试通过后会尽快上线,请大家关注后续更新公告。
3.2 客户端性能优化
我们会根据玩家当前所在的位置,动态加载附近的地图。目前在动态加载区域的边缘反复进出时,可能会引起卡顿,我们正在对UE引擎的垃圾回收的策略做专项优化来解决相关卡顿。本周的更新中上线了首批相关优化。
针对周围出现其他队伍的玩家或进入新区域时出现的卡顿。我们正在优化玩家和怪物创建的逻辑,尽量分散性能开销,来确保帧率不会产生过大波动。具体进展会在更新公告中与大家同步。
在不影响实际画面表现的前提下,冗余面数精简、LOD细化、材质贴图简化,精细化布置光照等常规的美术资产性能优化我们也在持续进行。
4. 写在最后
虽然我们之前进行过多轮测试,但由于测试人数较少持续时间也较短,更是由于我们缺少一些相关经验,上述的很多基础游戏体验和服务器性能的问题未能充分的暴露并得到妥善解决。非常抱歉在正式发售版本未能给大家提供足够稳定流畅的游戏体验!相关任务是我们目前最高优先级的工作,结合大家持续、详细的反馈,我们会逐步完善相关体验!
如果大家发现任何关于基础游戏体验或性能相关的问题,请通过社区向我们反馈,提供相关视频可以更好的帮助我们查明问题,感谢各位猎金人一直以来的支持。
我们也制作了一期视频方便大家查看更多,详见:
本期开发者日志发布后,我们将针对近期玩家集中关注的问题,开启一期 Q&A 问答,敬请期待!