我正在使用Opengl ES 2.0为Android构建一个非常简单的“游戏”。游戏玩法包括一个基于用户输入加速或减速的移动点。 当然,单帧中点所覆盖的空间取决于从最后一帧开始经过的时间量,因此要计算此空间,我将乘以点的速度和此时间量。
我也有一个按照我的观点移动的相机,但我翻转x和y轴以使相机跟随该点。
我的问题是点(和相机)不能平稳移动。顺便说一下,我不明白为什么,因为FPS总是60或至少55(我通过外部应用程序检查它们)。
如果我在帧和下一帧之间总是使用相同的时间,则一切都很平滑。
顺便说一句,为了理解什么是错误,我构建了一个非常简单的FPS计数器,并通过Log.d记录FPS(或经过时间)。在这里,我注意到值在45到80 FPS之间变化。现在,我认为如果我可以将此值锁定为最大值60(这是大多数智能手机屏幕刷新率),那么移动将更加顺畅。 所以我的问题是:如何避免我的应用在距离最后一帧0.0166秒之前绘制一帧?
感谢阅读并抱歉我的英语!
答案 0 :(得分:1)
我注意到这些值在45到80 FPS之间变化。
图形子系统会在一个可用时立即向应用程序返回一个缓冲区,因此,对于三重缓冲,在CPU上测量的帧时间可能有点不可预测,因为应用程序没有与合成器和CPU时间紧密锁定由于CPU频率变化可以移动。
一般情况下,显示更新的上限为60 FPS,但由于您的动画基于您在API级别上看到的经过的帧时间(与实际显示更新分离),因此您可以为每个帧设置动画,就好像这是45 FPS或80 FPS,这不是屏幕上实际显示的内容。
如果你知道你接近60 FPS,我会尝试平均过去3帧的经过时间,并使用该时间步长作为动画更新率。这应该消除由缓冲区滑动引起的大部分抖动,代价是对大型工作负载变化做出反应的小延迟。