4

EAGLViewアニメーションでサイズを変更しているものがあります。アニメーションNSTimerは、描画関数を呼び出すによって駆動されます。サイズを変更するEAGLViewときは、コンテンツのアスペクト比を維持するために、ビューの投影を調整する必要があります。描画関数は次のようになります。

gameView.frame = newFrame;
[gameView setFramebuffer];
[self updateProjection];

/* Drawing to the EAGLView, gameView, here, then... */  

[gameView presentFramebuffer];

ただし、このように実行すると、EAGLViewのコンテンツがアニメーションを「階段状」に下がるように見えます。それを記録してフレームごとに見ると、投影が調整されていることは明らかです。その後、ビューのサイズが非常に短時間で変更されます(1アニメーションフレーム未満)。

その理由は、のフレームの変更gameViewが延期されていることと、その間に更新されたフレームバッファが画面に表示されていることによるものと思われます。CATransactionsフレームの更新をすぐに有効にするためにを使用してみましたが、UIViewの変更を期待していたので、何もしませんでした。ビューポートを変更してEAGLViewフルフレームのままにすることはできると思いますが、それによって他の場所で同期の問題が発生する可能性があるのではないかと心配しています(たとえば、オーバーレイされたCALayerの更新など)。

これは問題の合理的な評価のように思われますか?どうすればそれを防ぐことができますか?つまり、フレームバッファの表示がEAGLView(および他のCA要素)の実際のフレームの変更と一致することを最も確実にするにはどうすればよいですか?

ありがとう!

4

1 に答える 1

1

EAGLView私が書いたカスタムで同様の問題が発生しました。問題は、向きを変更すると、ビューのサイズが変更されてコンテンツが引き伸ばされ、アニメーションのでのみ正しい比率のシーンが表示されることでした。

あなたの問題も同じだと思います.CoreAnimationがアニメーションフレームをレンダリングする前にビューが更新されるのを強制的に待つことはできないと思います.または操作するレイヤー)。

しかし、この問題は簡単に回避できます。ビューを含むxibファイルを開き、右側の属性インスペクターに切り替えます。あなたを選択しEAGLView(同じことが にも当てはまります)、 [表示]GLKViewセクションの下に[モード]属性があります。プログラムでビューを作成している場合は、プロパティを設定します。contentMode

この値は、アニメーション中にビューの内容がどのように管理されるかを示します。バッファが表示されるまで、古いシーンはそのモードに従ってサイズ変更されます。おそらく、達成する必要があるアニメーションに適したモードを見つけることができます.

  • プロポーションが気になる場合は、センターコンテンツ モードが機能する可能性がありますが、まだレンダリングされていないシーンの部分は、アニメーション中に空に見えます。

  • 残念ながら、再描画モードでは必ずしもEAGLView更新が行われるわけではありません。ビュー実際には再描画されますが、カラー バッファーの古い内容が含まれている可能性があります。これは、適切なタイミングでバッファーをいっぱいにする問題です。

  • 開始する前に、アニメーション全体をカバーするのに十分な大きさのフレームのサイズを変更してプリレンダリングすることを試みることができます。UIImageまたは、フレームを にレンダリングし、オンザフライでビューを置き換え、アニメーション化し、背面を配置しようとすることもできますがEAGLView、これはパフォーマンスに深刻な影響を与える可能性があります。

  • 私が自分の問題を解決した方法は、単純にEAGLView十分な大きさにすることでした。

  • 他の のブレンドに関してはCALayer、私が試した限り、同期の問題は発生しませんでした。可能な場合はEAGLView更新し、他のレイヤーも更新します。アルファ チャネルを使用している場合は、適切なプロパティを設定するCAEAGLLayerだけです。OpenGL がシーンを更新するたびにレイヤーをブレンドすると、パフォーマンスの面でコストがかかる可能性があることに注意してください。

于 2012-11-11T18:00:31.220 に答える