使用Thread.sleep()限制帧速率

时间:2011-08-04 13:45:57

标签: java android

我正在制作动态壁纸,所以不用担心物理碰撞。我只想尽可能保持平滑的帧速率,最高可达30fps,以节省电池电量。

为此,在循环结束时,我测量自该循环开始以来的时间。如果帧花费少于33ms,我使用Thread.sleep()来休眠ms的数量达到33。

但是,我知道Thread.sleep()不是非常准确,并且可能比我要求的睡眠时间更长。我不知道多少钱。

我可以使用哪种方法提供更均匀的速率吗?

3 个答案:

答案 0 :(得分:2)

是的,Thread.sleep()不是超精确的。

你可以尝试使用自适应策略 - 不要只是睡眠(剩余),而是有一个变长的lastDelay,并且,每次你观察到太高的帧速率你增加它,和Thread.sleep(lastDelay),每个你观察到帧速率太低的时候 - 你减少它。所以在第二次或关于你的代码后找到正确的号码......

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

相同

答案 1 :(得分:1)

我对此并不是100%肯定,但您是否尝试过使用Timer(http://developer.android.com/reference/java/util/Timer.html)和TimerTask(http://开发人员)。 android.com/reference/java/util/TimerTask.html)?您应该可以使用它来安排更新。

答案 2 :(得分:0)

在画布动画中,30fps看起来并不平滑。应该总是试着保持大约60fps,然后根据屏幕密度调整精灵运动的速度。 Thread.sleep()对于壁纸或2D游戏动画来说足够准确,如果fps仅上升或下降几帧,就无法注意到差异。

或者使用所谓的 frame-rate-independed-movement ,其中

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