多人游戏帧同步遇到失焦问题

在h5或小游戏中
多人游戏帧同步时某个客户端失焦导致update和计时器不运行导致同步不一致,大伙儿有啥简单的解决方法么?

最简单的客户端全部cc.director.pause 服务器发一帧客户端就跑一帧,这样子只要每个客户端都是按照顺序播放服务端的帧,就能保证每个客户端跑的画面都是一样。

还有一种把所有的逻辑放在逻辑帧里,update里只做插值 也就是当前的值到指定逻辑帧的补间。如果没有

如果失焦不久,链接还没断开,游戏依然会接受到数据,只是update没执行,恢复焦点后快速把接受到的数据执行一遍即可恢复同步状态。
如果已断开链接,那么就是短线重连流程,需要服务器提供开始游戏后的所有帧数据,客户端重新跑一次。如果是用的腾讯的那个服务,他们应该会在重连后自动给你推送整局的数据。

用setInterval替代update就完事了呗

setInterval 失焦也是不执行的

这个快速跑一遍如果只是涉及坐标移动,数值变动还好,有些比如是要等待动画播放完成的就麻烦了

关于龙骨动画播放相关的怎么处理?
比如:这一帧是A玩家放了一个技能的,按照逻辑是要等技能动画播放完成后执行下一个动作,那对于断线重连后这里怎么处理较好?

你试过吗 :rofl:cocoscreator失焦只是停止渲染,js引擎没有停

试过哦,失焦的话浏览器层面让整个定时器全暂停了

2.4.3,随便建个场景挂脚本,onLoad加入下面的代码:
let i = 0;

    let j = 0;

    setInterval(() => {

        Utility.log("xxxxxxxxxxxx:" + (i++))

    }, 1000);

    this.schedule(() => {

        Utility.log("yyyyyyyyyyyyyyyyyy:" + (j++))

    }, 1, cc.macro.REPEAT_FOREVER);

打包成h5运行 :joy:,浏览器最小化后yyyyyyy停止输出,xxxxxxxxxx难道也不输出吗

utility忽略,改成cc

是的 不输出

哈哈哈哈你赢了,祝你早日找到解决方案

要想在页面失焦后继续实现定时器功能貌似只能services workder

你的实现我估计有问题。
帧同步的游戏动画表现跟逻辑需要分开,仅对逻辑进行同步。
另外问一句,你是怎么处理游戏中的浮点数的?

有两个update,你可能把帧同步理解错了。

龙骨动画部分怎么拆?

前人的教训,多人项目建议趁早转状态同步,可能帧同步前期不用管太多服务器的东西,只负责转发,但是后期出了问题很难排查,而且断线重连问题更加复杂,用状态同步会经历转型的阵痛,但是问题更加明确,服务器可以查看日志。目前只建议数据量不大,对局时间短,人少的小型项目用帧同步。

帧同步的运算逻辑都在本地,会消耗手机性能,帧同步要处理浮点数精度问题,又增加了运算量。
出现不同步的时候你才知道什么叫绝望,看一晚上,都不一定能排查出一个小问题

怎么可能等动画播放完执行一个动作 你这样就是把逻辑写在渲染帧了 执行下一个动作不能通过本地的定时器回调不能通过动画播放结束回调 只能通过服务器。 下一帧永远是服务器告诉客户端 客户端的逻辑帧不会是自己驱动自己的