平滑运动 Opengl ES 2.0

Smooth movement Opengl ES 2.0

我正在使用 Opengl ES 2.0 为 Android 构建一个非常简单的 "game"。游戏玩法包含一个移动点,它根据用户输入加速或减速。 当然,单帧中点覆盖的 space 取决于从上一帧经过的时间量,因此要计算此 space 我将点的速度乘以该时间量。

我也有一个根据我的点移动的相机,但我翻转 x 和 y 轴以使相机跟随点。

我的问题是点(和相机)移动不流畅。顺便说一句,我不明白为什么,因为 FPS 总是 60 或至少 55(我通过外部应用程序检查它们)。

如果我在一帧和下一帧之间始终使用相同的时间量,那么一切都很流畅。

顺便说一句,为了了解问题所在,我构建了一个非常简单的 FPS 计数器并通过 Log.d 记录 FPS(或运行时间)。在这里,我注意到值在 45 到 80 FPS 之间变化。现在,我认为如果我可以将此值锁定为最大值 60(这是大多数智能手机的屏幕刷新率),那么移动会更加流畅。 所以我的问题是:如何避免我的应用程序在距离上一帧过去 0.0166 秒之前绘制一帧?

感谢阅读,对不起我的英语!

Here I noticed that values vary between 45 and 80 FPS.

图形子系统将 return 缓冲区一可用就提供给应用程序,因此使用三重缓冲时,在 CPU 上测量的帧时间可能有点不可预测,因为应用程序是未 运行 与合成器紧密锁定,并且 CPU 时间会因 CPU 频率变化而移动。

一般情况下,显示更新的上限为 60 FPS,但由于您的动画是基于您在 API 级别看到的经过的帧时间(与实际显示更新分离),您正在为每一帧设置动画,就好像它是 45 FPS 或 80 FPS,这不是实际出现在屏幕上的。

如果您知道自己接近 60 FPS,我会尝试一些方法,例如对最后 3 帧的经过时间进行平均,并使用该时间步长作为动画更新率。这应该消除大部分由缓冲区打滑引起的抖动,但代价是对大工作负载变化的反应有一点延迟。