【问题标题】:logical buffer load - slow framebuffer load - ios逻辑缓冲区加载 - 缓慢的帧缓冲区加载 - ios
【发布时间】:2012-09-13 07:29:25
【问题描述】:

我们正试图弄清楚为什么我们在 iphone 4 和 ipad 1 上的 FPS 相对较慢。 我们在打开的 GL 分析中看到了此类警告:逻辑缓冲区负载。摘要是“缓慢的帧缓冲区加载”。建议说帧缓冲区必须在渲染之前由 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];

【问题讨论】:

  • 我应该注意到,虽然分析器指出这是一个优化点,但根据我的经验,这是一个相当小的优化。奇怪的是,这与您的应用程序渲染缓慢的原因无关。查看 OpenGL ES 驱动器工具,看看您是最大化渲染器(片段受限)还是平铺器(几何受限)。
  • 我们确实运行了 openGL ES 工具,似乎我们正在最大化填充率(片段)。我们只渲染填充可见区域的 256x256 瓷砖。是否有任何我们可能需要查看的特定于苹果的扩展,无论是创建纹理还是我们设置纹理的方式,还是任何其他目的?
  • 作为对此的更新,我们设置 glHint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, GL_FASTEST);这似乎对 FPS 有很大帮助。
  • 有趣。您是否在某个着色器中使用dFdx() 或其他派生函数?
  • 我发现了完全相同的问题。我正在调用 glClear 并且我尝试在绘制之前明确丢弃帧缓冲区,但我仍然收到这些警告。

标签: ios opengl-es opengl-es-2.0 framebuffer


【解决方案1】:

经过大量的工作和深思熟虑,我最终设法解决了这个问题。

好的,我正在使用一个名为 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];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2018-10-25
    • 2021-02-19
    • 1970-01-01
    • 2023-03-07
    • 2014-06-26
    相关资源
    最近更新 更多