平滑运动Opengl ES 2.0

时间:2018-04-24 15:26:09

标签: java android opengl-es opengl-es-2.0

我正在使用Opengl ES 2.0为Android构建一个非常简单的“游戏”。游戏玩法包括一个基于用户输入加速或减速的移动点。 当然,单帧中点所覆盖的空间取决于从最后一帧开始经过的时间量,因此要计算此空间,我将乘以点的速度和此时间量。

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

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

如果我在帧和下一帧之间总是使用相同的时间,则一切都很平滑。

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

感谢阅读并抱歉我的英语!

1 个答案:

答案 0 :(得分:1)

  

我注意到这些值在45到80 FPS之间变化。

图形子系统会在一个可用时立即向应用程序返回一个缓冲区,因此,对于三重缓冲,在CPU上测量的帧时间可能有点不可预测,因为应用程序没有与合成器和CPU时间紧密锁定由于CPU频率变化可以移动。

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

如果你知道你接近60 FPS,我会尝试平均过去3帧的经过时间,并使用该时间步长作为动画更新率。这应该消除由缓冲区滑动引起的大部分抖动,代价是对大型工作负载变化做出反应的小延迟。