我正在制作动态壁纸,所以不用担心物理碰撞。我只想尽可能保持平滑的帧速率,最高可达30fps,以节省电池电量。
为此,在循环结束时,我测量自该循环开始以来的时间。如果帧花费少于33ms,我使用Thread.sleep()来休眠ms的数量达到33。
但是,我知道Thread.sleep()不是非常准确,并且可能比我要求的睡眠时间更长。我不知道多少钱。
我可以使用哪种方法提供更均匀的速率吗?
答案 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;