逻辑缓冲加载 - 缓慢的帧缓冲加载 - iOS

13
我们正在探究为什么iPhone 4和iPad 1的FPS相对较慢。我们在OpenGL分析中看到了这个警告类别:逻辑缓冲区加载。总结是“缓慢的帧缓冲区加载”。建议说,在渲染之前必须由GPU加载帧缓冲区。建议我们在每个框架的开头执行全屏清除操作。但是,我们使用glClear来执行此操作。
[EAGLContext setCurrentContext:_context];

glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
glClear(GL_COLOR_BUFFER_BIT);

// Our OpenGL Drawing Occurs here
抱歉,我只能回答英文问题。
// hint to opengl to not bother with this buffer
const GLenum discards[]  = {GL_DEPTH_ATTACHMENT};
glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards);

// present render
[_context presentRenderbuffer:GL_RENDERBUFFER];

我们实际上并没有使用深度或模板缓冲区。

当我们将纹理渲染为瓦片时,每次加载新瓦片时都会发生这种情况。它指向我们的glDrawArrays命令。

你有什么建议可以消除这个警告吗?

如果有帮助的话,这就是我们设置图层的方式:

eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
                                kEAGLColorFormatRGB565, kEAGLDrawablePropertyColorFormat,
                                nil];

2
我应该指出的是,虽然分析器指出这是一个优化点,但在我的经验中,它只是一个相对较小的问题。很可能,这与您的应用程序渲染缓慢的原因无关。请查看OpenGL ES Driver工具,并查看您是否达到了渲染器(片段受限)或瓦片式渲染器(几何受限)的最大值。 - Brad Larson
1
作为最新的更新,我们设置了glHint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, GL_FASTEST)。这似乎在FPS方面有所帮助。 - user1687195
有趣。你在着色器中使用 dFdx() 或其他导数函数吗? - Brad Larson
1
我也遇到了完全相同的问题。我调用了glClear,而且在绘制之前我还尝试了显式地丢弃帧缓冲区,但我仍然收到这些警告。 - Robotbugs
你尝试过同时清除 GL_DEPTH_BUFFER_BIT 吗?也许分析器只考虑了 glClear 调用而没有考虑 glDiscard 调用。在这种情况下,警告可能并不严格与性能相关。 - Pietro Saccardi
显示剩余2条评论
1个回答

0
经过大量的工作和深思熟虑,最终我成功地解决了这个问题。
好的,我正在使用一个名为GLESuperman的开源库。它是一个非常棒的库,可以帮助调试这些类型的问题,并且可以用于绘制图形 - 它非常快速。是的,我不知道为什么它被称为那样...但它是免费的并且它能够正常工作。只需在Github上搜索即可。它经常得到更新,并支持iOS 7及更高版本。
好的,要实现它,请执行以下操作:
// Import the framework into your Xcode project.
#import <GLESuperman/GLESuperman.h>

// Also you will need to import Core Graphics.
#import <CoreGraphics/CoreGraphics.h>

// In order to run it in debug mode and get 
// a live detailed report about things like FPS, do the following.
GLESuperman *debugData = [[GLESuperman alloc] init];
[debugData runGraphicDebug withRepeat:YES inBackground:YES];

// In order to draw graphics, do the following.
GLESuperman *graphicView = [[GLESuperman alloc] init];
[graphicView drawView:CGRectMake(0, 0, 50, 50];

// You can do other things too like add images/etc..
// Just look at the library documentation, it has everything.

[graphicView setAlpha:1.0];
[graphicView showGraphic];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接