【钥匙丝线】浅谈如何修复重机枪实际吞吐量超越扫射bug
枪神纪吧
全部回复
仅看楼主
level 11
超发明boy 楼主
每日一水
2021年07月26日 00点07分 1
level 11
超发明boy 楼主
琳琅天上最早为了在将近十年前的服务器和平均点满配置把当时画质拉满的枪神纪实现足够流畅,用的是减法策略。
即尽可能降低交互量和计算量,无论是特效上还是在设计上。
虽然肯定没有贺甲团队那么牛,但是思路和把崩三跑在手机上是相仿的。
崩三的许多特效都不是粒子特效和半透明特效,以黑鸭大招为例,出现的粉红色机枪,是缕空的实心色块,只是你第一印象像是半透明的粒子特效,实际上如果真的是半透明那么放这个技能你手机会卡炸。
这从当时的特效设计就可以看出,他们没有做榴弹导弹爆炸特效,也没有做轨迹特效,不是没想到,而是想到了也不会去做。
2021年07月26日 00点07分 3
level 17
[阴险][阴险]
2021年07月26日 00点07分 4
level 11
超发明boy 楼主
为了把减法这件事拉满
这个游戏对于时间的判定非常宽松,或者说是帧数低
像csgo,进行判定的效率可能是每帧一次或者每tick一次,所以大多数情况下很多bug他出现不了。
但是枪神纪有很大程度的判定机制,可能长达0.1秒。
2021年07月26日 00点07分 5
level 11
超发明boy 楼主
为什么会出现假背刺?
在不卡的时候,被刺方站着不同是不会出现假背刺的,但是在略有卡顿的运动战中,假背刺就会多了起来。
归根结底是因为双方的延迟和计算无法吻合,刺人的那边本地判断刺到人,被刺那边本地判断没刺到人。
最早曾经出现过拔网线去对方家里背刺然后秒杀全房的,为了修复这个问题更改了判断不同步时候的优先级。
当出现双方数据判断不一时,优先按照没背刺的来。
而在游戏不卡的年代这个问题并不明显,随着天美加了很多增加计算量的设计,游戏越来越卡,这个问题开始大规模暴露。
2021年07月26日 00点07分 6
level 11
超发明boy 楼主
天美对这个问题理解太浅,他们做了解决假背刺问题的最错误的一个决定。
那就是增加游戏部分检测序列的密度。
也就是把检测效率从原本一秒10次提高到了60或者更多,确实降低了假背刺的概率。
但是带来了新的问题。
枪神纪从当初的减法策略完全改变成了一个臃肿的东西了,即便是为了不卡砍画质,可是他还是越来越卡,因为卡的根本不是画质,是cpu计算和服务器的计算量。
2021年07月26日 00点07分 7
level 11
超发明boy 楼主
从那时候起,天命就开始拥有了炸房的卡顿属性,我预测就是在调整部分检测序列的时候,可能天命检测buff等等的东西,检测密度也跟着提高,对本地或者服务器端形成了很大的压力。
2021年07月26日 00点07分 8
level 11
你抓包看了吗?没有实践就没有发言权[滑稽]
2021年07月26日 00点07分 9
level 11
超发明boy 楼主
在我以前干过的游戏公司,曾经出现了一个极为卡顿的技能。
这是一个aoe技能,连续攻击八次,并且还能推怪。
在当时游戏通过活动叠加buff堆出了八位数的伤害数字后,对8只以上的怪物释放该技能,什么手机都会卡。
原因有2,一是每一个伤害数值的个位数都是一张独立的图片,游戏没有对这方面做到足够的优化。
二是在计算检测上,程序写得不好,出现了臃肿的for循环嵌套,在打八个以上怪物时,一瞬间能给cpu那边带来高达十几m的数据量。
2021年07月26日 00点07分 10
level 11
超发明boy 楼主
再来谈机枪宏加实际子弹吞吐量的原理。
以兽王450发为例,一次射出4发子弹,也就是113次才能射完。
这个游戏目前加入了连点冷却,也就是两次单点间隔不得低于0.15秒,否则不给于响应,而兽王扫射时一轮间隔是0.9375秒左右。
那么既然如此速点的机枪为什么能攻速加快呢?
2021年07月26日 00点07分 11
level 11
超发明boy 楼主
这游戏检测玩家放开了鼠标这件事,间隔估计是0.1秒。
也就是如果你把时间卡准了,在0.1秒内放开了鼠标在按住,没有被检测玩家鼠标放开了间隔给检测到,系统就会判断你是继续进行扫射,既然是在进行扫射,也没有检测到放开了鼠标,那么放开了鼠标得0.15秒后才能点击鼠标这件事,从根源上就避免了。
而新的一次按下鼠标,又产生了新的扫射序列指令,从零开始打出第一轮子弹。
比如,扫射三波子弹,卡检测时间用0.08秒放开再重新按上,系统判断不出你放开了鼠标,而新的按下鼠标又刷新了新的扫射时间序列,这就导致了在这一个瞬间,几乎同时打出了第一个序列的第三波子弹和第二个序列的第一波子弹。
原本是11111111的扫射序列,变成了112112112的实际扫射序列。
因此们在7.6秒打完了本来10.5秒才能打完的子弹。
2021年07月26日 00点07分 12
level 11
超发明boy 楼主
如何解决这个bug?
在【扫射状态下】接受新的左键按下指令是,不会刷新扫射序列这种操作我觉得很可能会带来新的恶性bug和卡顿。
不如可以考虑,增加一个,在【扫射状态下】再次接受到左键按下指令时,会直接退出扫射。
这对于短扫射,和纯扫射的玩家来说,是不会造成任何影响的。
而且不需要动底层的代码,只需要一个写在游戏内部的宏一样的判断就可以,实现起来容易,而且出现衍生问题的概率小。
2021年07月26日 00点07分 13
level 11
超发明boy 楼主
吃早餐上班去了[滑稽]
2021年07月26日 00点07分 14
level 14
分析的挺好,可是我看不懂[阴险]
2021年07月26日 01点07分 16
就是扫射机枪是4444444这样打子弹的,用了宏就是448448448这样打子弹的,实际上这是一个游戏的恶性bug,只是宏让人手很难做好的事情百分百地完成了。简单来说就是宏在卡恶性bug。
2021年07月26日 01点07分
@超发明boy 谢谢,我大概懂了
2021年07月26日 02点07分
level 17
2021年07月26日 01点07分 17
1 2 尾页