2009-03-26 15 views
3

私はglScissorを使用して、更新が必要な画面の部分だけを分離しようとしています。 私はすべてのフレームを更新する必要があるゲームエリアを持っていますが、UIエリアの更新頻度はそれほど高くありません。ゲームエリアは問題ありませんが、古いバッファデータのように見えるUI領域は常にちらつきます。glScissor help(iPhone OpenGL ES)

私には何が欠けていますか?ここで

は私のレンダリングコードです:

[EAGLContext setCurrentContext:context]; 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 

if (needsUIUpdate) 
{ 
    // clear entire screen 
    glScissor(0, 0, 320, 480); 

    glClear(GL_COLOR_BUFFER_BIT); 

    needsUIUpdate = NO; 
    [self updateUI]; 
} 
else 
{ 
    glScissor(0, 80, 320, 400); 
    glClear(GL_COLOR_BUFFER_BIT); 
} 

for (Cell* c in allCells) 
    [c animate]; 

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
+0

そして、glScissorがなければ、すべてうまく見えますか? – lhunath

+0

はい、私はglScissorを追加する前に、すべてうまくいきました。 – hyn

答えて

4

CAEAGLLayerkEAGLDrawablePropertyRetainedBackingを使用していますか?これをYESに設定しないと、バッファの内容はレンダリング後に保持されることが保証されません。言い換えれば、彼らは2つのバッファリングされたレンダリングをしています:2つの別々のバッファがあります。 1つは表示され、もう1つはレンダリングされています。あるフレームをレンダリングして表示すると、次のフレームが他のバッファにレンダリングされるため、内容は保持されません。 (これは画面の塊をクリアしないとガベージが表示される理由を説明しています)。このフラグを使用すると、グラフィックスシステムがフリップ中にデータをコピーして内容が保存される可能性があります。

このフラグを使用すると、メモリを増やしてレンダリングに時間がかかるため、上記の最適化ではそれほど価値がないかもしれません。それをプロファイルして見る必要があります。 (詳細についてはthe Apple docsを参照してください)

のデモをご覧ください。このプロパティを使用すると、毎回画面を再描画しないようにすることができます。

+0

ありがとう!私のkEAGLDrawablePropertyRetainedBackingはNOに設定され、これをYESに変更すると問題が解決しました。 私は、GPUが私のアプリケーションのボトルネックではないと思っています。私は、UI資産を表示する際の浮動小数点計算を避けたかったのです。レンダリングは以前と同じくらい速いです。 – hyn

+0

ありがとう - これも私の問題を解決しました。 –

1

あなたは絶対的に不足している:

glEnable(GL_SCISSOR_TEST); 

それはあなたが見ている成果物を説明するのに十分であるならば、私はよく分からないが、ちょうど欲しかったですそれを指摘する。 the documentationによると、シザーテストはデフォルトでは有効になっていません。

+0

セットアップコードでシザーテストが有効になっているため、投稿しませんでした。私は次回よりはっきりします。 – hyn

関連する問題