1

私はopenGL ESを使用してYUV420ビデオをUIView. 私はこのスレッド(CADisplayLink OpenGLレンダリングがUIScrollViewの動作を壊す)に従って、30fpsを達成しています。すべて問題ないようです。再生はスムーズです。ここで、Instruments を介してアプリを実行すると、いくつかの警告が表示されます。

  1. 論理バッファの読み込み - 概要 => フレームバッファの読み込みが遅い
  2. テクスチャの GPU 待機 - 概要 => テクスチャ アップロードでの GPU の CPU 待機
  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()他の 2 つは、各フレームで画像データをアップロードするのに時間がかかっていることを示しているだけです。iOS 5.0 でこれを行っている場合は、テクスチャ キャッシュを使用して、このアップロード プロセス (CVOpenGLESTextureCacheCreate()および友人) を高速化することを検討できます。それらは、少し余分なパフォーマンスを絞り出すのに役立つ場合があります。

于 2012-12-11T20:32:52.390 に答える