不要使用帧速率来衡量时间,而是使用时间来衡量时间。垃圾收集器可能需要花费3/10秒的时间,其他任务可能会在后台启动等等。总有一种系统/设置会比你想象中慢得多。然后,您不应该使用像素来指定速度,而应该使用像素/秒。每个动画帧需要一定的时间,等等。在游戏引擎中,计算下一个帧时,您的输入之一是“自上一帧以来经过了多长时间”。您将该值确定为秒的分数,并将您的速度/秒乘以该分数。结果是某个给定物体自上一帧以来移动的距离。请注意,非常缓慢的帧速率可能会对碰撞检测造成严重破坏,特别是对于快速移动的对象。如果Thing 1在帧之间完全穿过Thing 2,则仅检查BBoxes或半径是不够的。话虽如此,sleep() 是你的朋友。在处理一帧开始时,调用System.currentTimeMilis()。在处理一帧结束时(包括渲染),再次检查当前时间。如果差异不够长,则休眠(N)足够的时间以匹配所需的帧速率。因此,如果您希望最大帧速率为20fps,则每帧应花费50ms(1000ms / 20 = 50ms)。如果一帧仅需要10ms来模拟和渲染,则您需要休眠另外(50ms-10ms =)40ms才能进入下一帧。或者,您可以尽可能快地运行模拟,并仅在每隔一段时间后才渲染屏幕。这对电池寿命没有太大帮助(虽然如果我的Evo发热,OpenGL硬件加速是昂贵的),但可以提供非常平滑的体验。该,您甚至可以开始计算诸如运动模糊之类的东西。