使用Thread.sleep()限制帧率

7
我正在开发一个动态壁纸,因此无需担心物理碰撞。我只希望尽可能平滑地运行帧数,最多不超过30fps以节省电池电量。
为了实现这一点,在循环结束时,我会测量自循环开始以来的时间。如果帧的执行时间小于33ms,我将使用Thread.sleep()函数来休眠一定数量的毫秒数,使其达到33ms。
然而,我知道Thread.sleep()函数并不是非常准确,可能会比我所要求的时间长。我不知道会长多少。
是否有其他方法可以提供更平均的速率?
3个回答

2

是的,Thread.sleep() 并不是非常准确。

你可以尝试使用自适应策略——不要只是 sleep(remaining),而是有一个变量 long lastDelay,并且每次观察到帧速率过高时增加它,然后 Thread.sleep(lastDelay),每次观察到帧速率过低时减少它。所以在第二次或者之后,你的代码会找到正确的数字...

顺便说一下,Thread.sleep 不是限制帧速率的最佳方法。使用 Timer 更有前途——但你会遇到同样的问题,因为 Timer 的准确度可能与 Thread.sleep() 相同。


1

我不是100%确定,但你是否尝试使用Timer(http://developer.android.com/reference/java/util/Timer.html)和TimerTask(http://developer.android.com/reference/java/util/TimerTask.html)?你应该能够使用它来安排你的更新。


0

在画布动画中,30fps看起来一点也不流畅。应该始终尝试保持大约60fps,然后根据屏幕密度调整精灵移动的速度。Thread.sleep()对于壁纸或2D游戏动画已经足够准确,如果fps上下变化只有几帧,人们无法注意到差异。

或者使用所谓的帧率独立移动,其中

deltaTime = timeNow - prevFrameTime; //for 60fps this should be ~0.016s    
object.x += speedX * deltaTime;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接