OpenGL ES iOSシステムのOpenGL ESマルチタスク、高解像度、その他の機能の3番目の部分

iOSでのOpenGL ESのマルチタスク、高解像度、その他の機能

OpenGL ESの使用の多くの側面はプラットフォームに依存しませんが、iOSでのOpenGL ESの使用の詳細には特別な考慮が必要です。特に、iOSアプリケーションはOpenGL ESを使用してマルチタスクを正しく処理します。そうしないと、バックグラウンドに移動したときに終了するリスクがあります。iOSデバイス用のOpenGL ESコンテンツを開発するときは、ディスプレイの解像度やその他のデバイスの特性も考慮する必要があります。

マルチタスクOpenGL ESアプリケーションを実装する

ユーザーが別のアプリケーションに切り替えても、アプリケーションは引き続き実行できます。iOSでのマルチタスクの詳細については、アプリの状態とマルチタスクをご覧くださいアプリケーションがバックグラウンドに入ると、OpenGL ESアプリケーションは追加の作業を実行する必要があります。アプリケーションがこれらのタスクを適切に処理しない場合、iOSシステムによって終了される可能性があります。同時に、アプリケーションがOpenGL ESリソースを解放する必要がある場合、これらのリソースをフォアグラウンドアプリケーションで使用できます。

バックグラウンドアプリがグラフィックハードウェアでコマンドを実行しない

iOSシステムは、バックグラウンドアプリケーションがグラフィックプロセッサにアクセスするのを防ぎます。そのため、フォアグラウンドのアプリケーションは常に最高のエクスペリエンスをユーザーに提供できます。アプリケーションがバックグラウンドに入ると終了するだけでなく、GPUに送信されたコマンドがバックグラウンドに入る前にクリアされた場合にも終了します。アプリケーションは、以前に送信されたすべてのコマンドがバックグラウンドに入る前に実行されることを確認する必要があります。GLKitのビューまたはビューコントローラーを使用している場合は、描画メソッドでOpenGL ESコマンドを送信するだけです。アプリケーションがバックグラウンドに入ると、自動的に正しく実行されます。デフォルトでは、GLKViewControllerクラスは、アプリケーションがアクティブでないときにアニメーションタイマーを停止して、描画メソッドが呼び出されないようにします。GLKitのビューまたはビューコントローラーを使用していない場合、またはGLKView描画メソッドの外部でOpenGL ESコマンドを送信する場合は、次の手順を実行して、アプリケーションがバックグラウンドで終了しないようにする必要があります。1.アプリケーションのプロキシのapplicationWillResignActive:メソッドで、アプリケーションはアニメーションタイマー(存在する場合)を停止し、それ自体を良好な状態にしてから、glFinish関数を呼び出す必要があります。2.アプリケーションプロキシのapplicationDidEnterBackground:メソッドで、アプリケーションが一部のOpenGL ESオブジェクトを削除して、メモリとリソースをフォアグラウンドアプリケーションで使用できるようにする場合があります。glFinish関数を呼び出して、リソースがすぐに削除されるようにします。3.アプリケーションのapplicationDidEnterBackground:メソッドを終了します。新しいOpenGL ES呼び出しは許可されません。通話がある場合、iOSシステムによって終了されます。4.アプリケーションのapplicationWillEnterForeground:メソッドで、オブジェクトを再作成し、アニメーションタイマーを再起動します。

背景に入る前に簡単に再作成できるリソースを削除します

アプリケーションがバックグラウンドに入ると、アプリケーションはOpenGL ESオブジェクトを解放する必要がなくなります。一般に、アプリケーションはそのコンテンツの処理を回避する必要があります。次の2つのシナリオを検討してください。1.ユーザーがゲームをプレイしていて、簡単に離れてカレンダーを表示します。プレーヤーがゲームに戻ったとき、ゲームのリソースはまだメモリ内にあり、ゲームはすぐに再開できます。2.ユーザーが別のOpenGL ESアプリケーションを起動すると、OpenGL ESアプリケーションがバックグラウンドになります。そのアプリケーションがデバイスで利用可能なメモリより多くのメモリを必要とする場合、システムは追加の操作を実行せずにアプリケーションを自動的に終了します。

目標は、アプリケーションを優れたものにすることです。つまり、フォアグラウンドに入るのにかかる時間ができるだけ短くなり、バックグラウンドでのメモリ使用量が削減されます。1.アプリケーションは、テクスチャ、モデル、およびその他のリソースをメモリに保持する必要があります。アプリケーションのバックグラウンドに入ったときに、再作成に時間がかかるリソースを破棄しないでください。2.すばやく簡単に再作成できるオブジェクトは破棄する必要があります。オブジェクトを検索すると、大量のメモリが消費されます。

単純な目標は、アプリケーションによって割り当てられたフレームバッファを割り当てて、レンダリング結果を保存することです。アプリケーションがバックグラウンドにある場合、ユーザーには表示されず、OpenGL ESを使用して新しいコンテンツをレンダリングすることはできません。これは、アプリケーションのフレームバッファによって消費されるメモリが割り当てられるが、それは役に立たないことを意味します。また、フレームバッファの内容は一時的なものです。ほとんどのアプリケーションは、新しいフレームがレンダリングされるたびにフレームバッファーのコンテンツを再作成します。これにより、レンダーバッファはメモリを集中的に使用するリソースになり、簡単に再作成でき、バックグラウンド処理に入るときにオブジェクトの候補として適しています。GLKitビューまたはビューコントローラーを使用している場合、背景に入ると、GLKViewControllerクラスが自動的に関連するビューフレームバッファーを処理します。他の用途でフレームバッファを手動で作成する場合は、アプリケーションがバックグラウンドに入ったときにそれらを処理する必要があります。どちらの場合も、そのときに適用された他の一時的なリソースの処理も考慮する必要があります。

高解像度ディスプレイをサポート

デフォルトでは、GLKitビューのcontentScaleFactorプロパティは、それを含む画面のストレッチと一致し、それに関連付けられたフレームバッファーは、最大解像度でレンダリングするように構成されています。UIKitで高解像度ディスプレイをサポートする方法の詳細については、「ビューでの高解像度画面のサポート」を参照してくださいCore Animationレイヤーを使用してOpenGL ESコンテンツをレンダリングする場合、そのストレッチファクタはデフォルトで1.0です。Retinaディスプレイで最大解像度を描画できるようにするには、CAEAGLLayerオブジェクトの伸縮係数をトレースして、画面の伸縮係数と一致させる必要があります。サポートされているデバイスが高解像度の場合は、それに応じて適用されたモデルとテクスチャリソースを調整する必要があります。高解像度のデバイスで実行する場合は、より詳細なモデルとテクスチャを選択して、より良い画像をレンダリングすることができます。逆に、標準解像度のデバイスでは、より小さなモデルとテクスチャを選択できます。

高解像度ディスプレイのサポートを決定する際の重要な要素は、パフォーマンスです。Retinaディスプレイでは、ストレッチファクターが2倍になり、ピクセル数が4倍に増えるため、GPUで処理されるフラグメントの数は4倍になります。アプリケーションが多数の単一クリップを計算する場合、ピクセルの増加によりフレームレートが低下することがあります。高いスケールファクタでアプリケーションの実行速度が大幅に低下する場合は、次の点を考慮してください。1.ドキュメントのパフォーマンスチューニングガイドラインを使用してフラグメントシェーダーを最適化する2.フラグメントシェーダーに単純なアルゴリズムを実装する これを行うと、単一ピクセルの品質が低下し、高解像度で完全なイメージがレンダリングされます。3。1.0と画面のスケール係数の間の小数スケール係数を使用します。1.5のスケール係数は、1.0のスケール係数よりも優れています。画像の品質、および塗りつぶす必要のあるピクセル数が2.0にスケーリングされた画像よりも少ない; 4. GLKViewオブジェクトのdrawableColorFormatプロパティとdrawableDepthFormatプロパティに低精度の形式を使用します。これにより、基になるレンダーバッファーのメモリ帯域幅が減少します。5。ストレッチファクターとマルチサンプリングを有効にします。もう1つの利点は、マルチサンプリングにより、高解像度ディスプレイをサポートしていないデバイスでも高品質を実現できることです。

複数のインターフェースの向きをサポート

他のアプリケーションと同様に、OpenGL ESアプリケーションは、コンテンツに適したユーザーインターフェイスの向きをサポートする必要があります。サポートされているインターフェイスの向きをinfo.plistで宣言するか、OpenGL ESコンテンツビューコントローラーのsupportedInterfaceOrientationsメソッドを使用してインターフェイスの向きを宣言できます。デフォルトでは、GLKViewControllerとGLKViewは方向の変更を自動的に処理します。ユーザーがデバイスをサポートされている向きに回転させると、システムは向きの変化をアニメーション化し、コントローラービューのサイズを変更します。サイズが変更されると、GLKViewオブジェクトはそれに応じてフレームバッファーとビューポートのサイズを調整します。この変更に対応する場合は、GLKViewControllerまたはそのサブクラスにviewWillLayoutSubviewsまたはviewDidLayoutSubviewsメソッドを実装するか、使用するカスタムGLKViewサブクラスにlayoutSubviewsメソッドを実装します。Core Animationレイヤーを使用してOpenGL ESコンテンツを描画する場合でも、アプリケーションには、インターフェースの向きを管理するためのviewControllerが含まれています。

おすすめ

転載: www.cnblogs.com/tzsh1007/p/12679222.html