update dt 数值波动太大了,


这个问题,引擎大大们,还没解决吗? 会不会是创建prefab影响了update调用

1赞

数字变动太大,会导致camera移动卡顿, 这是老掉牙的问题。 求引擎组重视!

1赞

这就是帧率不稳定了

有什么办法保持稳定吗?限制帧率的方法也找不到了。

mark

自己定时器管理?你这里一定需要60帧的吗?

每一次update时,你需要变化的值根据dt来变化应该可以。比如计划是每帧移动10个像素,也就是60帧的情况下,每0.0167秒移动10个像素,当dt不固定时,比如变成0.0333秒时,就移动20个像素。具体大概就是10*dt/0.0167个像素

就是这样才会出现卡顿的,如果用 dt*speed (比如speed等于500)这样每一帧移动的位置都不固定,界面就会出现卡顿的情况,如果直接在update里面添加固定值 比如10 就会好很多,但还是会有微卡顿的情况

正经回复一下问题,大量的计算(比如大量的创建和销毁,大量的循环),的确会使游戏卡顿,这个卡顿就会影响update的dt时间,这个需要对工程进行优化,减少计算量,尽量不要实时加载资源

1赞

飞机类的项目,帧率必须要50以上

1赞

这个,我不是要求你减少游戏帧率,是通过一些手段降低计算量。比如飞机类的游戏,对于大量的飞机和子弹的创建和销毁,可以分别写个管理类,初始创建一定量的对象,在对象销毁时,不remove,而是回收到自己的管理类,不进行销毁。可以加一个reset,重置接口,复用需要反复创建的对象,避免大量销毁和创建。

3赞

各种方法已尝试



已放弃 等待引擎组来解决

其实前面已经说的很完善了,因为每帧update中需要执行的逻辑不同,可能这一帧基本每什么逻辑,而下一帧需要在update中执行很多node的创建或者其他的逻辑。这导致了每一帧需要的逻辑执行时间并不相同,可能这一帧执行完逻辑需要10ms,下一帧执行完就需要160ms。作为一个单线程的引擎,假设你这一帧执行逻辑需要160ms,而你需要固定update的dt(假如是16ms),那么在这一帧执行到第16ms的时候你就强制执行第二帧的逻辑,可数据是连续的,这样子第二帧在执行的时候使用的数据就有可能是不正确的数据。从而造成显示上的错误以及后续一系列的错误。
因此对于单机类游戏,不建议也最好不要去强制让每帧按照固定步长去执行。

你要做的是检查你自己的代码或者是通过一些工具,比如devTools去查看你的瓶颈在哪里?比如正常情况下都是低于16ms的,突然有一些帧高于16ms,比如你图片中某些帧耗时到了0.045s(就是是22fps),那这是为什么?是因为突然的内存飙升么?还是在这一帧做了大量的逻辑计算?等等。针对热点问题再进行优化。
类似 @番茄爱吃西红柿 这样论坛上面的热心群众,在没有你的完整代码时,只能提出一些方案或者方向给你去参考。
盲目的进行尝试并不能解决问题,需要找到问题的引发点,再进行针对性的处理,才能彻底解决。

补充一下前面所说的,使用dt*speed是一个很好的相机移动的方法。

2赞
var time1 = Date.now();
var t1 = 0;
var count1 = 0;
setInterval(() => {
	t1 = (Date.now() - time1) / 1000;
	if(t1 >= 0.02){
		count1++;
	}
	time1 = Date.now();
},1000 / 60);


var time2 = Date.now();
var t2 = 0;
var count2 = 0;
var fun2 = function() {
	t2 = (Date.now() - time2) / 1000;
	if(t2 >= 0.02){
		count2++;
	}
	time2 = Date.now();
    window.requestAnimFrame(fun2);
}
window.requestAnimFrame(fun2);

var time3 = Date.now();
var t3 = 0;
var count3 = 0;
var fun3 = function() {
	t3 = (Date.now() - time3) / 1000;
	if(t3 >= 0.02){
		count3++;
	}
	time3 = Date.now();
    setTimeout(fun3, 1000/60);
}
setTimeout(fun3, 1000/60);

我这个测试有意义么?

大佬,我之前一直就是用的 dt*speed 但是抖动都比直接 += 固定值还要厉害,这就是问题所在了。

4种方法就属第三个比较顺畅些。

程序中存在高耗时操作,找到位置后优化,setInterval或者直接用update(dt)的问题或者dt*speed都不是根本问题。方向错了

1赞

看到你打印的dt,应该有间歇性的高耗时操作,可以尝试分帧处理

onload的时候创建最大值的prefab到pool里面,感觉好点了,现在像素抖动范围感觉在-1-1之间了。

摄像头的跟随操作放在lateUpdate里面试试