3

OpenGLESを使用してiPhone用の簡単なゲームを作成しました。この問題を除いて、すべて正常に動作します。

電話を完全にオフにしてからオンに戻し、アプリを起動すると、この奇妙なちらつきが発生します。他のすべてのフレームは正しいです...間違ったフレームは同じフレームを何度も繰り返します。アプリを終了したら、もう一度起動してください。すべて問題ありません。終了して10回続けて再起動すると、毎回すべてが正常になります。

しかし、電話をオフにしてから再びオンにしてからアプリを起動すると、アプリを初めて起動したときに同じちらつきが発生します。

なぜこうなった?!

他の誰かがこの問題を抱えていましたか?

乾杯!

4

5 に答える 5

3

Apple は、この問題に関する追加情報を公開しました。

Q: OpenGL ES アプリケーションがちらつきます。特に iPhone 3GS で実行すると、フレームごとにちらつきが発生するようです。この問題を解決するにはどうすればよいですか?

A: デフォルトでは、レンダーバッファのコンテンツは、画面に表示された後 (-EAGLContext/presentRenderbuffer: を呼び出して) 無効化されます。フレームを描画するたびに、アプリケーションはレンダーバッファの内容を完全に再描画する必要があります。そうしないと、ちらつきやその他の予期しない結果が発生する可能性があります。

画面上のすべてのピクセルに色を指定する必要があります。描画コードの最初で、glClear() を使用してカラー バッファを初期化することをお勧めします。フレームの開始時に、カラー、深度、およびステンシル バッファー (使用している場合) のそれぞれをフルスクリーンでクリアすると、通常、アプリケーションのパフォーマンスが向上します。

アプリケーションがフレーム間でドローアブル コンテンツを保持する必要がある場合は、オプション kEAGLDrawablePropertyRetainedBacking = YES を CAEAGLLayer オブジェクトの drawableProperties プロパティに追加できます。このオプションを使用すると、追加のメモリが必要になり、アプリケーションのパフォーマンスが低下する可能性があります。

于 2010-06-12T07:25:02.087 に答える
1

現在の画像と固定画像の間で点滅/ちらつきが交互に発生するという同じ問題がありました... 3GSでは発生しますが、3G、第1世代、またはシミュレータでは発生しません。

私の場合、問題は ESRenderer でコンテキストを設定したときに発生しましたが、実際には何も描画しませんでした。つまり、以下のコードでは、[シーン描画] は特定の状態で何も描画しませんでした。古い iPhone と Sim では、何も描画しない場合、OpenGL バッファが反転するようには見えませんでしたが、3GS では反転します。とにかく、私の回避策は、何も描画していないときにアニメーションを停止する (つまり、描画ルーチンを呼び出すタイマーを停止する) ことでした。

- (void) draw
{
   [EAGLContext setCurrentContext:context]; 
   glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
   glViewport(0, 0, backingWidth, backingHeight);

   //Render the GLScene...
   [scene draw];

   glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
   [context presentRenderbuffer:GL_RENDERBUFFER_OES];   
}
于 2010-05-11T07:10:20.210 に答える
1

この問題は、iPhone OS がアプリケーションを制御する (ロックして再開する、または警告ポップアップを表示する) ときに発生する頂点バッファーの破損に関係していると考えられます。私もこの問題を抱えていますが、適切な修正が見つかりませんでした。シーン内の 1 つまたは複数のオブジェクトのようです。テクスチャ アトラスを使用していますが、テクスチャを共有する他のオブジェクトは影響を受けていないようです。頂点バッファーを破棄して再作成すると、問題が解決する可能性があります。

于 2010-01-20T02:06:30.480 に答える
1

OpenGL の更新を行わずに glRenderBuffer() を呼び出して、presentRenderBuffer メッセージを EAGLContext に送信している可能性はありますか。つまり、新しい glDrawElements または glDrawArrays はありません。kEAGLDrawablePropertyRetainedBacking を YES に設定せずにこれを行うと、迷惑なちらつきが発生する可能性があります。

CAEAGLLayer の drawableProperties プロパティの kEAGLDrawablePropertyRetainedBacking を見てください。このプロパティは、コンテンツを表示した後のドローアブル サーフェスの動作を決定します。このプロパティが NO に設定されている場合、コンテンツは保持されないため、表示後に変更されないことが保証されません。YES に設定すると、コンテンツは保持され、表示後も変更されません。

kEAGLDrawablePropertyRetainedBacking を YES に設定すると、問題がマスクされますが、修正されません。

于 2010-01-19T19:08:24.370 に答える
1

うーん。私は iPhone で OpenGL を使ったことはあまりありませんが、他のアプリケーションではこの動作に気づいていないと言わざるを得ません。アクティブなフレームバッファの切り替え方法に関係していると思われます。

サンプル コードのいくつかを見て、何が違うのかを確認してください。

于 2008-10-16T21:08:05.097 に答える