【问题标题】:Smooth movement Opengl ES 2.0平滑运动 Opengl ES 2.0
【发布时间】:2018-04-24 15:26:09
【问题描述】:

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

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

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

如果我在一帧和下一帧之间总是使用相同的时间,那么一切都很顺利。

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

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

【问题讨论】:

  • 我认为大多数(全部?)智能手机已经使用垂直同步,因此它们肯定会被锁定为 60 fps。你如何测量你的帧速率?给我们看一些代码。
  • @Thomas 我创建了一个类,它存储最后两帧的时间并减去它们

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回答。我如何了解我是否启用了三重缓冲?顺便我试试你的方法。感谢您对实际情况的准确解释,非常有用!
  • 据我所知,Android 在所有生产设备上默认为 OpenGL ES 使用三重缓冲,尽管它是由设备制造商控制的系统属性。我不确定是否可以从应用程序 API 轻松查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2015-08-08
相关资源
最近更新 更多