建议:逻辑与渲染分离

千万别再加什么多线程的东西了,能保证现在平台可以不crash就烧香了。

:sweat_smile:只是我自己写的伪代码,想大概表达我的意思

这个跟U3D的fixedUpdate是一个意思,里面用到了for,在一帧里面处理了多个帧的逻辑,跟我的需求有点出入哈:sweat_smile:

不过既然此贴又浮上来了,我就再次陈述一下我的尘封的愿望吧。

通常的游戏,一般是把一次逻辑和一次渲染的处理,放在一帧里面执行的,就像这样:
第一帧:逻辑,渲染
第二帧:逻辑,渲染
第三帧:逻辑,渲染
……
正常情况是不会有大问题的,而我期待的类似于:
第一帧:逻辑,(没有渲染)
第二帧:逻辑,渲染
第三帧:逻辑,(没有渲染)
第四帧:逻辑,渲染
……
也就是,渲染并非每帧执行,而是优先保证逻辑满帧。(当然如果游戏卡到连逻辑也没法满帧,那证明要么机器太烂,或者游戏设计的太复杂)

YY下我们正在玩一款飞行射击类游戏,正常情况下,只有你跟几架敌机在画面内,这时不会卡顿,子弹跟飞机的碰撞也正常。突然间,我们遇到了BOSS,一架体型庞大造型复杂的航空母舰,舰上布置了各种炮塔,所有炮塔一起发射,各种烟花各种炫目各种物理特效,画面瞬间卡的不要不要的,但是逻辑是正常的,追踪的导弹还是精准的命中了目标,该死的死,该爆炸的爆炸……

如果飞机游戏真是卡到这种情况,最保底的方案是整体降帧,保证逻辑和画面一致

这个我觉得官方可以考虑做,以前cocos2d-x v3.x 很难做到,creator毕竟在此基础上重新组织UI框架,可以加多线程渲染。

你这里有个问题…… 第三帧没渲染,那么 fps 就相当于 30fps。动作游戏 30fps 还是会看得出卡顿的。

我觉得更好的是,
第一帧:逻辑,动画,渲染
第二帧:无逻辑,动画,渲染
第三帧:逻辑,动画,渲染
第四帧:无逻辑,动画,渲染

逻辑包含物理什么的,不需要 60fps
动画包含 particle/action/tween,需要 60fps,否则渲染就看不出差异

首先,你说的对。其次,动画这种东西,我也把它当成逻辑的一部分了。
曾记得以前做端游的时候,我们是把 UI、物理、动画、技能伤害计算、网络、渲染 等都单独开,分别控制帧率,一般是UI最低,因为界面上的东西大部分都是不动的。

2赞

如果单纯从例子来看,在物理上叫TOI(Time of Impact),这个问题在BOX2D早已有解决方案,只是Chipmunk没有而已,如果用Box2d来模拟整个游戏世界,那这个问题就很容易解决。
如果要实现渲染和逻辑分开,大概就两种方式:
1、基于单线程,严格控制每帧所耗费的时间,这个难度有点大,几乎所有模块都得加入时间消耗统计和中断处理。
2、基于多线程,把逻辑单独放在一个另一条线程上,但是逻辑里面涉及到创建精灵、Label、骨骼动画之类的,都无法立即创建获得结果,需要封装成一个个的请求发给渲染线程,然后在渲染线程处理创建、销毁的事情。在使用的过程中需要非常小心,线程使用不当会出现很多安全问题。

挖个坟,有个问题,现在基于cocos creator2.4,引擎走的是浏览器js那一套,我尝试开个计时器去定义这个fixedUpdate,不依赖组件update那一套,但是基于现在的js和浏览器环境,就是个单线程在渲染,存在一个所谓的任务队列,一旦渲染时间过长,计时器还是会被堵在任务队列里无法执行,有什么更好的思路么,web worker能实现么

既然是单线程,就不要去纠结,肯定会阻塞,肯定只能是fixedUpdate那一套,况且既然是单线程,你是怕阻塞之后会影响什么吗?直接for执行之前的所有逻辑不就好了吗,都是顺序执行,啥都不影响不是吗

你这个愿望是可以实现的,直接把游戏帧率限制在30帧,然后每一个渲染帧后执行两帧逻辑帧,因为没有渲染,所以你的这两帧逻辑只要是在下一帧渲染前完成的话,就毫无影响,你要做的唯一一个难点就是保证这两帧不会卡到渲染帧掉帧,不过即便掉帧也是能保证2:1的逻辑:渲染。

你的理解错了,就是因为js 浏览器那一套渲染就是单线程的,所以开计时器也无法模拟fixedUpdate,因为计时器是个异步任务(宏任务),只会周期性的丢到任务队列里,所以渲染时间太久,长时间执行占用调用栈,这个计时器任务一直会被阻塞在任务队列里,我想问的是 有什么好办法去实现这个fixedUpdate

可以考虑使用js自身的setInterval,需要会受主进程影响, 每个周期有浮动, 点是至少是 不跟director的mainLoop挂在一起, 就算mainLoop有报错, setInterval依旧在跑, unity的fixedUpdate 不是100%固定的,也是会受到主线程性能影响导致调用时间有浮动的
如果native 不能用setInterval, 就只能是在原生程弄定时器, 然后jsb调用了

这挖的有点深

这坟头草都有10米高了 :rofl:

可是你实现这个有啥用,我描述的方法不也能解决你这个贴存在的问题吗,fixedUpdate即便你实现了,如果不渲染,玩家也感知不到不是吗

请问有什么比较好的办法可以解决这个帧率不太稳定的问题吗。
因为实验室需要恒稳定刷新的帧率达到60fps/1s,每一帧的延迟误差不超过±2ms(有专业的光敏仪器进行测试)。Unity和MonoGame目前可以达到但是跨平台效果不好。
用cocos creator做出来的安卓端在一加和Unity合作的游戏手机上就比较稳定,放在华为平板上就不太稳定了。
很想找到合适的方法解决这个问题。

经过我的测试 目前 影响帧率最大的问题 就两个
一个是单帧逻辑复杂度 ,这个需要你自己处理/
另外一个就是node 的创建销毁 ,其中有以带lable的节点尤其废效率。
一次性销毁100个节点一定会掉帧的。那么就把100个节点 都放到list队列,然后分帧销毁
其他的一些优化的比如降低dc