我正在使用OpenGL ES 3.0开发一个Live Wallpaper。我根据http://www.learnopengles.com/how-to-use-opengl-es-2-in-an-android-live-wallpaper/上出色的教程进行设置,适配GLSurfaceView并将其用在Live Wallpaper中。
我对OpenGL/GLSL最佳实践有相当不错的了解,并设置了一个简单的渲染流水线,其中绘制循环尽可能紧密。没有重新分配,使用一个静态VBO用于不变数据,一个动态VBO用于更新,在着色器中没有分支等。通常情况下我的性能非常好,但看似随机但经常会出现帧速率下降的情况。
通过屏幕上的条纹进行剖析,我发现黄条(“等待命令完成”)的间隔超过了关键的60fps阈值。
我阅读了所有可以找到的关于剖析和解释这些数字的资源,包括此处的深入问题。然而,从那个问题中得出的主要结论似乎是黄杆表示花费时间等待阻塞操作完成,以及关于帧依赖性的问题。我不认为我有任何这样的情况,我只是在每帧都绘制一切。
我的问题很广泛 - 但我想知道什么因素会导致这种类型的帧速率下降,以及如何在确定问题方面前进。
以下是一些可能或可能没有影响的详细信息:
- 我按需渲染,在onOffsetsChanged触发器中(脏渲染)进行渲染。 - 只有一个纹理(创建并仅绑定一次),1024x1024 RGBA。用一个简单的vec4替换一个texture2D调用似乎有助于消除一些帧速率下降。将纹理大小减小到512x512对性能没有任何影响。 - 着色器不复杂,并且如上所述不包含分支。 - 场景中数据不多。只有大约300个顶点和一个纹理。 - sysTrace没有发现可疑的方法 - 与缓冲区填充和状态调用相关的GL方法不在列表的顶部。
更新: 作为一项实验,我尝试只渲染每两帧,而不是在onOffsetsChanged(向左/向右滑动)时请求每次呈现。虽然外观和感觉很糟糕,但几乎完全消除了黄色延迟峰值。这似乎告诉我每秒60次请求过多,但我无法弄清原因。
我对OpenGL/GLSL最佳实践有相当不错的了解,并设置了一个简单的渲染流水线,其中绘制循环尽可能紧密。没有重新分配,使用一个静态VBO用于不变数据,一个动态VBO用于更新,在着色器中没有分支等。通常情况下我的性能非常好,但看似随机但经常会出现帧速率下降的情况。
通过屏幕上的条纹进行剖析,我发现黄条(“等待命令完成”)的间隔超过了关键的60fps阈值。
我阅读了所有可以找到的关于剖析和解释这些数字的资源,包括此处的深入问题。然而,从那个问题中得出的主要结论似乎是黄杆表示花费时间等待阻塞操作完成,以及关于帧依赖性的问题。我不认为我有任何这样的情况,我只是在每帧都绘制一切。
我的问题很广泛 - 但我想知道什么因素会导致这种类型的帧速率下降,以及如何在确定问题方面前进。
以下是一些可能或可能没有影响的详细信息:
- 我按需渲染,在onOffsetsChanged触发器中(脏渲染)进行渲染。 - 只有一个纹理(创建并仅绑定一次),1024x1024 RGBA。用一个简单的vec4替换一个texture2D调用似乎有助于消除一些帧速率下降。将纹理大小减小到512x512对性能没有任何影响。 - 着色器不复杂,并且如上所述不包含分支。 - 场景中数据不多。只有大约300个顶点和一个纹理。 - sysTrace没有发现可疑的方法 - 与缓冲区填充和状态调用相关的GL方法不在列表的顶部。
更新: 作为一项实验,我尝试只渲染每两帧,而不是在onOffsetsChanged(向左/向右滑动)时请求每次呈现。虽然外观和感觉很糟糕,但几乎完全消除了黄色延迟峰值。这似乎告诉我每秒60次请求过多,但我无法弄清原因。