在IOS上使用OpenGL进行三重缓冲

问题描述 投票:0回答:1

我们的应用仍在IOS上使用OpenGLES2.0。是的,我知道我们应该使用Metal,但是我们的应用程序也可以在Android上运行。虽然大多数情况下它以60 fps的速度运行都非常令人满意,但偶尔也会出现故障,在某些情况下,它似乎是在拍摄一帧渲染场景然后转换两帧之间交替进行。 1,2,1,2,1,1,2 ...然后,在不更改渲染内容的情况下,它将跳回到1,1,1,即60fps。延迟是在我们“展示”了最后一个缓冲区之后的第一个glClear中。我想OpenGL仍在渲染最后一个场景,它必须等待整个帧才能再次同步。也许我们的渲染/更新循环接近或刚好超过整个帧-这将有助于解释延迟,因为它“错过了” vsync。

但是,如果我们有三重缓冲,我希望帧时间是1,1,2,1,1,2,1,1,2 ..而不是1,2,1,2,1,2,1 。有没有办法让IOS使用三重缓冲?

目前,我们似乎只初始化了两个'缓冲区'

GLuint viewRenderbuffer;
GLuint viewFramebuffer;
glGenFramebuffers(1, &viewFramebuffer);
glGenRenderbuffers(1, &viewRenderbuffer);
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);

然后我们在每帧渲染完成后称呼它

glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER];

通常,我希望在某个地方调用glSwapbuffers,但是我希望它在presentRenderbuffer调用中。我想这取决于驱动程序,然后处理双倍或三倍缓冲。

是否有强制三重缓冲的方法,或者实际上已经在使用它。

谢谢肖恩

ios rendering opengl-es-2.0
1个回答
0
投票

默认情况下,iOS上的渲染是三倍缓冲的。这样可以防止框架撕裂和/或停顿。当平均帧时间大于垂直同步间隔所施加的限制时(例如60 FPS〜16.6ms),通常会发生帧卡顿。您可以在XCode概要分析工具中检查该时间,也可以使用系统计时器自己测量该时间,并将结果绘制到调试HUD中。

具有相同渲染条件的意外性能下降可能是由于操作系统对CPU / GPU频率的管理。

[请查看有关框架起步的讨论(6:00及以后)https://developer.apple.com/videos/play/wwdc2018/612/

另一方面,性能可能不佳,不仅是因为原始负载,还因为同步问题。同步问题的一个示例是回读帧缓冲区内容或对动态顶点/索引缓冲区的不正确处理。

提高移动设备的渲染性能是一个复杂的问题,涉及对FBO的谨慎处理,以避免不必要的带宽使用。您可以使用XCode分析工具和帧捕获来查找瓶颈。

© www.soinside.com 2019 - 2024. All rights reserved.