基于2d-x的游戏回放(录像)的一些思考和疑问,求解决思路

我们的游戏需要制作类似COC的战斗回放功能,但一直没找到好的解决方法.

近期一直在思考这个问题,总结了两个关键点,只要解决这两个问题,就能完美回放了.

1.随机数
随机数的不同导致的两次战斗结果可能截然不同,因此需要保证正常战斗和回放时产生出来的随机数完全一致,这个可以通过自己重写生成随机数算法来解决,但需要注意一点是随机函数调用的顺序和次数,顺序和次数不同也会导致后续产生的随机数和之前完全不同.

2.解决两桢之间的时间dt问题(两桢的间隔时间)
这个很头疼,我没找到好的解决办法,现在的大多数游戏引擎为了保证在高性能设备和低性能设备运行效果一致都大量使用了dt运算(2d-x也是如此),比如从A点移动到B点用时3秒,那在所有设备上都会呈现出3秒时间内A一定移动到B,只是有些设备有跳帧,有些很平顺.

问题来了,低性能设备由于运算慢,导致dt比高性能设备的dt大,这样在逻辑判断时就会存在差异,比如判断碰撞时,我设定当物体1的 x 坐标到达1.05的时候发生碰撞,那在某一桢的时候,低性能设备的x坐标是1.06,发生了碰撞,而高性能设备的坐标却是1.04,没有发生碰撞,这样误差就出来了,就不是1:1回放了.像这种和dt相关的运算太多太多了,综合起来运算出来的结果和原本的几乎就是两场战斗了.

我试过另一种方式,把dt固定下来,也就是完全基于桢进行运算,这样回放是没问题了,完全一致,但是低性能的机器上run起来就会很卡,不流畅,也不是好的方法.

感觉COC就没这个问题,不管什么机器run起来都是一样的,而且回放也是完全一致的,不知道采用了什么算法!

请大家给点解决思路,万分感谢!

比较正确的做法是渲染跟逻辑分开,也就是update和draw分开
保证逻辑上运行一致,渲染在低配置的机器上就少渲染几次。

感谢回复~

这倒是个办法,不过2d-x目前并不支持逻辑和渲染分离,得改底层架构了

1.记录随机数种子,随机数种子相同,产生的随机数序列也相同
2.如yujiang所说,逻辑帧和渲染帧分开。用多线程实现可能会麻烦些,简单处理的话,把用于计算的时间值t固定,在update(float dt)中,用dt/t,得出本次update中逻辑运算执行次数,记下余数,并入下一次update的dt。

楼主 最后问题找到解决方案没得,我现在也遇到跟你一样的问题