1

我正在使用 openGL ES 在UIView. 我正在关注这个线程(CADisplayLink OpenGL 渲染会破坏 UIScrollView 行为)以实现 30fps。一切似乎都还好。播放流畅。现在我想我通过 Instruments 运行我的应用程序,但我收到了一些警告:

  1. 逻辑缓冲区加载 - 摘要 => 缓慢的帧缓冲区加载
  2. GPU 在纹理上等待 - 摘要 => CPU 在纹理上传上等待 GPU
  3. 纹理上传非最佳 GPU 利用率 - 摘要 => 中帧纹理上传

在我的回调中,我执行以下操作:

[EAGLContext setCurrentContext:_context];
glClear(GL_COLOR_BUFFER_BIT);

// load the color components into OpenGL
glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_Y]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frameWidth, frameHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, (UInt8*)yuvFrame.luma.bytes);

glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_U]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frameWidth/2, frameHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, (UInt8*)yuvFrame.chromaB.bytes);

glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_V]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frameWidth/2, frameHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, (UInt8*)yuvFrame.chromaR.bytes);

// draw
glDrawElements(GL_TRIANGLE_STRIP, sizeof(indices)/sizeof(indices[0]), GL_UNSIGNED_SHORT, 0);
[_context presentRenderbuffer:GL_RENDERBUFFER];

在此调用之前,在 的init方法中UIView,我生成纹理并设置一些参数,如下所示:

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

glGenTextures(NUM_TEXTURES, _textures);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_Y]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glUniform1i(_uniformSamplers[SAMPLER_Y], TEXTURE_Y);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_U]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glUniform1i(_uniformSamplers[SAMPLER_U], TEXTURE_U);

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, _textures[TEXTURE_V]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glUniform1i(_uniformSamplers[SAMPLER_V], TEXTURE_V);

虽然,就像我说的播放效果似乎不错,但我想尝试修复这些警告。我尝试了几件事但没有成功。我能够删除它们的唯一方法是glGenTextures(NUM_TEXTURES, _textures)/glDeleteTextures(NUM_TEXTURES, _textures)在回调的开始/结束时调用,但我认为这不是正确的方法。

有没有人有什么建议?

4

1 回答 1

0

您列表中的第一个警告有时可能是 Instruments 中的误报,因此它可能根本不是真正的问题。但是,这可能表明您没有正确清除帧缓冲区的先前状态,因此您可以检查以确保除了您的GL_COLOR_BUFFER_BIT.

另外两个只是告诉您glTexImage2D()在每一帧上上传图像数据需要一段时间。如果您在 iOS 5.0 上执行此操作,您可以考虑使用纹理缓存来加速此上传过程(CVOpenGLESTextureCacheCreate()和朋友)。它们可能会帮助您挤出一点额外的性能。

于 2012-12-11T20:32:52.390 回答