小编Asy*_*lum的帖子

OpenGL核心配置文件在OS X上令人难以置信的减速

我在我的引擎中添加了一个新的GL渲染器,它使用核心配置文件.虽然它在Windows 和/或nvidia卡上运行良好,但它在OS X上慢了10倍(3 fps而不是30).奇怪的是,我的兼容性配置文件渲染器运行正常.

我用仪器和GL分析器收集了一些痕迹:

https://www.dropbox.com/sh/311fg9wu0zrarzm/31CGvUcf2q

它表明应用程序将时间花在glDrawRangeElements上.我尝试了以下事项:

  • 改用glDrawElements(没效果)
  • 翻转剔除(对速度没有影响)
  • 禁用某些GL_DYNAMIC_DRAW缓冲区(无效)
  • 绘制后VAO后绑定索引缓冲区(无效)
  • 将索引转换为4字节(无效)
  • 使用GL_BGRA纹理(无效果)

我没有尝试的是将我的顶点对齐到16字节边界和/或将索引转换为4字节,但严重的是,如果这将是问题那么为什么标准允许它呢?

我正在创建这样的上下文:

NSOpenGLPixelFormatAttribute attributes[] =
{
    NSOpenGLPFAColorSize, 24,
    NSOpenGLPFAAlphaSize, 8,
    NSOpenGLPFADepthSize, 24,
    NSOpenGLPFAStencilSize, 8,
    NSOpenGLPFADoubleBuffer,
    NSOpenGLPFAAccelerated,
    NSOpenGLPFANoRecovery,
    NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
    0
};

NSOpenGLPixelFormat* format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
NSOpenGLContext* context = [[NSOpenGLContext alloc] initWithFormat:format shareContext:nil];

[self.view setOpenGLContext:context];
[context makeCurrentContext];
Run Code Online (Sandbox Code Playgroud)

试过以下规格:

  • radeon 6630M,OS X 10.7.5
  • radeon 6750M,OS X 10.7.5
  • geforce GT 330M,OS X 10.8.3

你有什么想法我可能做错了吗?同样,它与兼容性配置文件一起工作正常(但不使用VAO).

更新:向Apple报告.

更新:苹果公司不会对这个问题感到厌恶...无论如何,我创建了一个实际上很好的小测试程序.现在我将调用堆栈与Instruments进行了比较,发现在使用引擎时,glDrawRangeElements会进行两次调用:

  • gleDrawArraysOrElements_ExecCore
  • gleDrawArraysOrElements_Entries_Body

而在测试程序中它只调用第二个.现在第一次调用就像立即模式渲染(gleFlushPrimitivesTCLFunc,gleRunVertexSubmitterImmediate),所以显然会减速.

opengl macos profile performance core

6
推荐指数
1
解决办法
2326
查看次数

OpenGL帧缓冲附件泄漏GPU内存

请考虑以下测试代码:

for (int i = 0; i < 100; ++i) {
    GLuint fboid = 0;
    GLuint colortex = 0;
    GLuint depthtex = 0;

    // create framebuffer & textures
    glGenFramebuffers(1, &fboid);
    glGenTextures(1, &colortex);
    glGenTextures(1, &depthtex);

    glBindTexture(GL_TEXTURE_2D, colortex);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4000, 4000, 0, GL_BGRA, GL_UNSIGNED_BYTE, 0);

    glBindTexture(GL_TEXTURE_2D, depthtex);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 4000, 4000, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0);

    glBindFramebuffer(GL_FRAMEBUFFER, fboid);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colortex, 0);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, depthtex, 0);

    assert(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER));

    // clear it
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);

    // delete everything …
Run Code Online (Sandbox Code Playgroud)

memory opengl framebuffer

5
推荐指数
1
解决办法
542
查看次数

标签 统计

opengl ×2

core ×1

framebuffer ×1

macos ×1

memory ×1

performance ×1

profile ×1