【问题标题】:Android OpenGL occasional stutterAndroid OpenGL 偶尔卡顿
【发布时间】:2016-11-13 19:06:47
【问题描述】:

我使用 NativeActivity 编写了一个 OpenGL ES 2 应用程序,它呈现大约 6 个带纹理的三角形,您可以使用触摸输入拖动它们。该应用程序正在尽可能快地渲染,在渲染之前调用glClear(),在渲染之后调用eglSwapBuffers()。正如预期的那样,帧速率被限制在 60 fps 左右的显示频率,并且场景流畅地移动。但是,经过一段时间(10 到 60 秒)后,即使帧速率仍为 60 fps,运动也开始出现断断续续的现象。我使用的设备是一加3。

起初我怀疑罪魁祸首是省电模式,但调查显示 CPU 频率与卡顿之间没有相关性。

我确实注意到了一些有趣的事情,当queueBuffer() 执行时间增加时,口吃就开始了。

这是 systrace 之前的口吃: 这是 systrace after 口吃: 这是从之前到之后的转换过程中的 systrace:

如何阻止应用卡顿?

【问题讨论】:

  • 在没有看到任何代码的情况下很难提供帮助...可能是垃圾收集问题?您是否在每一帧中创建了许多对象?
  • 完全没有,我用的是NativeActivity,目前根本不用Java对象。

标签: android opengl-es


【解决方案1】:

我仍然不知道卡顿的确切原因,但我设法找到了解决方法:仅在 Choreographer.postFrameCallback 上渲染帧并将 eglPresentationTimeANDROID 设置为将来的两个 vsync。这样可以避免填满缓冲区队列,这似乎是导致卡顿的原因之一。

作为奖励,它还稍微改善了触摸输入延迟。

更多信息在这里:Minimize Android GLSurfaceView lag

【讨论】:

    猜你喜欢
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多