3

私のアプリケーションはopenGLベースであり、ES1.1とES2.0をサポートしています。

私のビューコントローラには、EAGLViewのインスタンスであるビューがあり(Appleのサンプルコードによる)、ES 1.1または2.0のいずれかで異なる「レンダラー」オブジェクトを使用します(Xcodeサンプルを使用したことのある人にとってはほぼ標準です)。

CADisplayLinkを使用して画面を更新します。少なくともiOS4.0以降をターゲットにしているので、問題はないはずです。

起動時に、起動画像(Default.png)が表示された後の最初のフレームが黒く表示されます。間にある1フレームの迷惑な黒いちらつき。

ウィンドウキーと表示を作成する前に、更新/レンダリングサイクルの1ラウンドを「偽造」すると(バックバッファも空にならずにレンダリングされるように)、ちらつきは消えますが、ES2.0を使用している場合のみです。

kEAGLDrawablePropertyRetainedBackingをYESに設定しましたが、どちらの値も違いがないようです。

ES 1.1を使用すると、ちらつきが残ります。唯一の違いは、ウィンドウを表示する前に「更新」を実行すると、glClearColor()で指定した色に画面がちらつくことです。ただし、事前に更新しないと、ちらつきは常に黒になります。

私はCocos2dフォーラムでこの問題について何度も議論を見てきましたが、そこでさえ問題は常に戻ってきて、新しいハックが発生するたびにあなたを噛むようです。

それにもかかわらず、私はプレーンなOpenGL ES( Cocos2dやその他のライブラリではありません)を使用していますが、Webをどのように検索しても、同様の問題を抱えている人を見つけることができません...

ヒントはありますか?

4

4 に答える 4

4

問題の原因は、あなたが診断したとおりです。関連するビュー コントローラーの読み込みがすぐに完了したとき (つまり、Default.png 画像が削除されたとき)、まだコンテンツがありません。CADisplayLink は、そのフレームの最後までトリガーしません。

NIB になかったビューのビットを設定する場所であるため、正しいことは、完全な再描画を実行して viewDidLoad: に表示することだと思います。シングルまたはダブル バッファとして実装されていると仮定すると、どちらのレンダリング パスでもレイテンシのフレームが発生することはありません。

他の診断不可能な問題が発生していると仮定すると、あるケースでは、コードの性質が自分の制御を超えているために、事前にフレームを描画することができなかったアプリがありました (クロスプラットフォームのポートであるために、グルーコードのみを実行します)。だから私がしたことは、私の最初のView Controllerの上にDefault.pngを含むフルスクリーンのUIImageViewを追加することでした。次に、1 フレーム待ってから UIImageView を削除しました。レンダリングループが何であれ、それはうまくいくはずです。

于 2011-02-25T12:13:00.417 に答える
1

最初のフレームを描画する前に、余分な presentRenderbuffer を (もちろん、glBindRenderbuffer を先に) 追加することで、まったく同じ問題を解決しました。何らかの理由で、GLView は何かの表示を開始するために 2 つの presentRenderbuffer 呼び出しを必要とします。とにかく奇妙ですが、バックバッファの処理に関連している可能性があります。

于 2012-12-11T08:29:29.357 に答える
0

layoutSubviewsOpenGLViewクラスのメソッドでシーンを再描画する必要があります。

-(void)layoutSubviews {
    GLint backingWidth, backingHeight;

    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);

    glViewport(0, 0, backingWidth, backingHeight);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    [scene draw];
    [context presentRenderbuffer:GL_RENDERBUFFER];
}
于 2013-02-15T09:17:43.553 に答える