Important: 最良の結果を得るためには、アプリケーションが一貫して達成可能なフレームレート を選びます。スムーズで一貫したフレームレートは、一貫性のないフレームレートの場合よりも
2.0 に拡大された画像よりも塗りつぶしに必要なピクセル数は少なくて済みます。
●
GLKView
オブジェクトのdrawableColorFormat
およびdrawableDepthFormat
プロパティに対し て精度の低い形式を使用する。これによって、基盤となるレンダバッファ上で操作するために必 要なメモリ帯域幅を減らします。● 低い倍率を使用し、マルチサンプル機能を有効にする。さらなる利点として、マルチサンプル機 能は高解像度ディスプレイをサポートしていないデバイス上で、より高い品質がもたらされるこ とが挙げられます。
GLKView
オブジェクトのマルチサンプル機能を有効にするには、そのdrawableMultisample
プロ パティの値を変更します。GLKit Viewへのレンダリングを行わない場合は、マルチサンプル機能 バッファを手動で設定し、最終画像の表示前にそれらを解決する必要があります(“マルチサンプ ル機能の使用による画像品質の向上” (43 ページ)を参照)。マルチサンプル機能は負担を伴わないわけではありません。追加のサンプルを格納するには追加 のメモリが必要となり、リゾルブフレームバッファへのサンプルのリゾルブには時間がかかりま す。マルチサンプル機能をアプリケーションに追加する場合は、パフォーマンスが許容できる水 準を維持できるよう、アプリケーションのパフォーマンスを必ずテストしてください。
高解像度ディスプレイのサポート
デバイスの向きに応じた調整
他のアプリケーションと同様に、OpenGL ESアプリケーションがそのコンテンツに適切なデバイスの 向きをサポートする必要があります。
supportedInterfaceOrientations
メソッドを使用して、ア プリケーションの情報プロパティリスト、またはOpenGL ESコンテンツをホストしているView Controller で、アプリケーションに対してサポートされているデバイスの向きを宣言します。(詳細について は、『View Controller Programming Guide for iOS』を参照。)デフォルトでは、
GLKViewController
およびGLKView
クラスは向きの変更を自動的に処理します。ユーザがサポートされている向きにデバイスを回転すると、向きの変更がアニメーション化され、
View Controllerのビューのサイズが変更されます。サイズが変わると、 GLKView
オブジェクトはそれに応じてそのフレームバッファとビューポートのサイズを調整します。この変更に対応する必要がある 場合は、
GLKViewController
サブクラスのviewWillLayoutSubviews
またはviewDidLayoutSubviews
メソッドを実装するか、カスタムGLKView
サブクラスを使用している場合は、layoutSubviews
メソッ ドを実装します。Core Animationレイヤを使用してOpenGL ESコンテンツを描画する場合は、ユーザデバイスの向きを管
理するためにアプリケーションにView Controllerを含める必要があります。外部ディスプレイへの OpenGL ES コンテンツの表示
iOSデバイスは、外部ディスプレイにアタッチできます。外部ディスプレイの解像度とコンテンツの
倍率は、メイン画面とは異なる可能性があります。フレームをレンダリングするコードで適合するよ う調整する必要があります。外部ディスプレイへの描画手順は、メイン画面に描画する場合とほとんど同じです。
1.
Multiple Display Programming Guide for iOS
の手順に従って、外部ディスプレイにウインドウを作成 します。2. レンダリング方法に適したビューまたはView Controllerオブジェクトをウインドウに追加します。
●
GLKitでレンダリングする場合は、 GLKViewController
およびGLKView
(またはカスタムサブ クラス)のインスタンスを設定し、そのrootViewController
プロパティを使用してそれら をウインドウに追加します。●
Core Animationレイヤへのレンダリングを行う場合、レイヤがウインドウのサブビューとして
含まれるビューを追加します。レンダリングにアニメーションループを使用する場合は、ウ インドウの
screen
プロパティを取得し、displayLinkWithTarget:selector:
メソッドを呼 び出して、外部ディスプレイに対して最適化されたディスプレイリンクオブジェクトを作成 します。デバイスの向きに応じた調整
ここまで、iOSアプリケーションにOpenGL ESを組み込むための基本事項を説明したので、この章で は、高い処理性能を発揮するレンダリングエンジンの設計に役立つ事項を解説します。レンダラの設 計に関する重要な概念をこの章で取り上げ、以降の章ではさらに、よりよい設計技法や、性能改善の ための技術を紹介します。
OpenGL ESを視覚化する方法
この節では、OpenGL ESの設計を思い描けるよう、クライアント/サーバアーキテクチャとパイプライ ンという、2つの概念を取り上げます。いずれも、アプリケーションのアーキテクチャを計画、評価 する上で有用な概念です。
クライアント/サーバアーキテクチャとしてのOpenGL ES
図 6-1に、OpenGL ESをクライアント/サーバアーキテクチャとして表した図を示します。アプリケー ションは、状態変化、テクスチャや頂点のデータ、レンダリングコマンドを、OpenGL ESクライアン トとの間でやり取りします。クライアントはこれを、グラフィックスハードウェアが認識できる形式 に変換し、GPUに転送します。この処理はアプリケーションの描画性能に対するオーバーヘッドにな ります。
図 6-1 OpenGL ESのクライアント/サーバアーキテクチャ
処理性能を改善するためには、このオーバーヘッドをうまく管理しなければなりません。適切に設計 されたアプリケーションは、OpenGL ESに対する呼び出しの頻度を落とし、ハードウェアにとって適 切なデータ形式を採用して変換の負荷を抑え、OpenGL ESとの間でやり取りするデータの流れを注意 深く管理します。
OpenGL ES 設計ガイドライン
グラフィックスパイプラインとしての OpenGL ES
図 6-2に、OpenGL ESをグラフィックスパイプラインとして表した図を示します。アプリケーションは グラフィックスパイプラインを構成し、描画コマンドを実行して、頂点データをパイプラインに送り 込みます。パイプラインとして連続している各ステージでは、頂点シェーダが頂点データを処理し、
これをプリミティブとしてまとめ、ラスタライズしてフラグメントにし、フラグメントシェーダが各 フラグメントの色や深度を計算し、これをフレームバッファにブレンドして、最終的な表示に到りま す。
図 6-2 OpenGL ESグラフィックスパイプライン
アプリケーションがどのようにしてフレームを生成しているのか、思い浮かべるためのモデルとして パイプラインを使うとよいでしょう。レンダラの設計も、これに応じていくつかに分けておこないま す。すなわち、シェーダプログラム(パイプラインの頂点ステージやフラグメントステージを処理)
を記述し、このプログラムに送り込む頂点データやテクスチャデータを編成し、パイプラインの固定 機能ステージを駆動するようOpenGL ESの状態機械を設定する、という分割です。
グラフィックスパイプラインの各ステージは、それぞれの計算処理を同時に実行できます。たとえ ば、アプリケーションが新しいプリミティブを用意している間に、グラフィックスハードウェアの独 立した各部分が、それまでに送り込まれたジオメトリデータをもとに、頂点やフラグメントの計算を 進めるのです。もっとも、後のステージの処理は、前のステージの出力に依存します。パイプライン のいずれかの段階の作業量が多すぎる場合、または作業の実行に時間がかかりすぎている場合、ほか のパイプラインは、最も時間のかかっている段階が作業を完了するまでの間、アイドル状態となりま す。グラフィックスハードウェアの能力に応じ、パイプラインの各ステージの処理量が均衡していれ ば、よい設計ということになります。
OpenGL ESを視覚化する方法