逻辑帧率大于渲染帧率时,位移有卡顿感,有好办法解决吗?

一款本地运行的单机塔防游戏,目前设置的逻辑帧率是40,渲染帧率是60,默认运行时1.5倍数,所以正好一个渲染帧对应一个逻辑帧,但是游戏加速到2倍数时,1秒钟跑80个逻辑帧,势必会出现两个渲染帧之间多跑了一个逻辑帧的情况。这样从视觉表现上看就是跳帧了,一次位移中出现多次跳帧看着就很卡顿了。
不要问为啥是1.5倍速和2倍速,策划的要求 :joy:

以某个节点的x变化例子:
1.5倍速时为,逻辑帧[1,2,3,4,5,6],渲染帧也是[1,2,3,4,5,6]。
2倍速时为,逻辑帧[1,2,3,4,5,6,7,8],渲染帧则是[1,2,4,5,7,8]。
中间某些信息是渲染不到的,视觉上看起来就是卡顿。

针对这个问题,我尝试了以下办法:
一、提高倍速时降低逻辑帧率,例如1.5倍速时逻辑帧率为40,渲染帧率60,正好1比1,2倍速时逻辑帧率为30,渲染帧率60,也能达到1比1。看起来确实不卡了,但是会造成伤害的丢失,因为同样一条直线出去逻辑帧高时能生效的帧就多,逻辑帧低时,两帧之间位移过大,会导致某些目标被越过,从而丢失伤害以及一些重要技能的命中。在倍速差别不大时问题不明显,但是高倍速下差别明显。故放弃。

二、直线的弹道采用动画直接控制起点到终点的移动,消失时控制其消失,这样确实不卡了,但是很难处理子弹在飞行途中玩家改变游戏速度的问题,而且也不灵活,只能用于直线飞行的子弹,轨迹复杂的很难实现。

请问各位有啥好办法吗?

用帧间隔时间做位移

咋做呢,举个例子?

逻辑帧?那为什么你不渲染帧里做逻辑处理啊,渲染帧里拿到渲染时间差去匹配你的逻辑就好了啊,onUpdate啊

渲染帧里做逻辑处理有一些缺点,不能将ui和数据分离,而且这一套框架是从之前做的一套网游塔防里弄过来的,不好改了

不用放渲染逻辑的代码里啊,你自己用cocos的onUpdate就好了啊,你总要绑代码进场景吧,逻辑帧从定时调用改成scene里面的update去调用应该不影响多少内容吧

现在就是用的cocos的update来驱动逻辑帧的,核心问题不在谁驱动谁,而是两者的步调不一致,逻辑帧快了渲染的时候会有跳跃

因为我没搞懂既然你用的都是cocos的onUpdate那为啥还会俩不一样,
我尝试理解的是逻辑帧处理伤害的话比如1秒40帧是会出现40段伤害所以不能改逻辑帧的速率是吗?那可能要改成伤害生效的逻辑从帧生效变成时间间隔算伤害?不知道我理解的对不对

你前面说的这种方式,本质上跟我说的第一种解决方案是一样的,会丢伤害,尤其是高倍速时例如10倍速,原先一个子弹出现到死亡在1倍速下要经过60帧,10倍速下只有6帧,路径上有些敌人是打不到的,再加上很多极限的情况也处理不了,例如子弹速度特别快,或者触发频率特别高

哦明白了,我搞反了,那确实,相当于是帧动画里面每间隔一帧就抽掉。想象了一下相当于是一帧走了一步,第二帧走两步,这样凑一起就是加快了1.5倍的意思,如果用帧间隔时间做位移的话就是ui和数据分离才能做到

比如,子弹移速是2px/ms,初始位置是0,如果帧率是40,那么下一帧理论上位置是0+帧间隔时间 * 2。伤害也是按帧间隔时间做,比如,伤害间隔为10ms一次,那么理论上一帧的伤害次数就是 帧间隔时间/10,超出的时间保存,再补到下一帧

这个做法好像不能处理高倍速的问题吧,帧的间隔做位移确实能做到移动平滑,你看下我前面的回复,高倍速会导致两帧之间的位移过大,某些目标会被越过而丢伤害

如果倍数太高,平滑是不可能处理的,平滑只能由帧率决定。穿透问题可以重写碰撞检测解决,把经过的路径作为一个碰撞体进行碰撞检测

1赞

固定更新步进,然后多次迭代

移速太快的小物体间碰撞,必然会出现穿透,如果是物理引擎,一般都有防穿透设置(设置bullet属性);如果没有,1、可以调整碰撞体大小,也可调整为矩形碰撞,增加移动方向的碰撞体长度;2、限制子弹允许的最大速度(尽量以30帧时的dt为准);3、锁定目标,使用距离检测是否碰撞(或子弹只做效果动画,根据距离和速度延迟触发伤害,或直接触发伤害);4、必要时也要和策划掰扯,告诉他们很多东西只是感动自己,玩家其实很少在乎,像子弹移速也可以整体降速,提高整体性能和玩法才最重要。