前回に引き続き Flash Player 15 と Adobe AIR 15 の新機能です。今回は Stage3D に関連する話題です。
該当する機能は、具体的には、
- Context3D.clear() の呼び出しに関する制限の緩和
- Windows 8 上の IE のズーム比に対応
- モバイル環境での “Standard” プロファイルのサポート
の 3 つです。
描画ターゲット設定時のバッファクリアの制限の緩和
Context3D.clear() は、色、深度、ステンシルの 3 つのバッファをリセットするメソッドです。
Stage3D では、setRenderToTexture() により描画ターゲットをテクスチャーに設定したら、実際の描画処理を行う前に clear() を呼び出してバッファ初期化が必須とされていました。Flash Plyaer 15 と AIR 15 からは、初回の描画のときの初期化のようなを例外として、この制限がありません。
この変更の背景は、おおよそ以下のような点にあります。
- clear() は状況により処理時間が長くなることも
- 一方、事前に全てのバッファをクリアしなくても影響の無いケースが存在
- 深度バッファやステンシルバッファを再利用したい場合もある
不要な clear() 呼び出しを減らしてGPUの負荷を下げたり、バッファの再利用による最適化を試すことが可能になるというわけです。
特に、複数のレンダリングターゲットを使用しているケースや、テクスチャーが浮動小数点形式だったりすると、clear() の処理時間がかかる傾向が見られるそうです。このような条件が思い当たれば clear() の省略を試してみる価値があるかもしれません。
一方、描画ターゲットを指定するテクスチャにアンチエイリアスを有効に (0 以外を指定) した場合は、clear() 省略がアンチエイリアス処理用のバッファとのやり取りを余分に発生させることから、パフォーマンスが悪化する可能性があるそうです。アンチエイリアスが必須の場合はご注意くださいとのこと。
チューニングの結果には GPU のアーキテクチャーが大きく影響します。たとえば、最近は多くのモバイルデバイスで使われているらしいタイルベースのレンダリングでは、clear() の省略がバッファデータの再書き込みにつながるようです (参考)。
減った分より増えた分が大きければ却って遅くなってしまうかも。ということで、モバイルを主ターゲットに含むアプリやゲームでは、clear() の扱いを決める際、特に慎重なテストが求められそうです。
setRenderToBackBuffer() でバックバッファをターゲットに設定した後、描画前に clear() が必須な点はこれまでどおりで変わりません。
深度バッファとステンシルバッファの再利用
上記のとおり Flash Player 15 / AIR 15 からは、複数のテクスチャ間で深度バッファやステンシルバッファを共有可能です。共有の条件は、clear() を呼ばないことと、テクスチャ同士の大きさが一致することです。
例えば、いったん描画したシーンを再利用したい場合、テクスチャだけでなく深度情報も一緒に再利用して、シーンの中に光源を追加したりとかでもできそうです。
ちなみに、「描画ターゲットとして使用する可能性があるテクスチャ」 を生成する場合は、Context3D.createTexture() の 4 番目の引数 optimizeForRenderToTexture を true にするのが強いお勧めだそうです。false を指定すると情報の保護が保障されない環境があるとのこと。
あと、テクスチャとバックバッファの間で、深度バッファとステンシルバッファは共有されません。従って、Context3D.configureBackBuffer() を呼ぶ際に enableDepthAndStencil 引数の値を false にしていても、上のシナリオには影響ありません。
Windows 8 上での IE のズーム比への対応
Microsoft Surface の IE は、何故か (たぶん訳あって) 標準のズーム比が 150% です。これが原因で 3D コンテンツの表示がボケたようになってしまったりしていたことに対応すべく、コンテンツの拡大表示を実現する仕組みが Flash Player ActiveX に追加されました。
NPAPI にはブラウザ側のズーム比を知らせる機能が無いため、Firefox や Safari でこの機能が使えるようになることは今後もなさそうです。PPAPIは検討の余地があるようで、Chrome や Opera の将来のバージョンでは対応されるかも?しれません。
さて、今回の追加機能は大きく 2 種類に分けられます。ズーム比を通知する機能と、Stage3D バックバッファの自動スケール機能です。
まず、ズーム比の通知のために追加されたのは、
Stage.browserZoomFactor Event.BROWSER_ZOOM_CHANGE
の 2 つです。
Stage.browserZoomFactor は現在のブラウザのズーム比を示します。値が 1.0 ならば標準倍率で表示されていることになります。読み取り専用で、この値を使ってブラウザのズーム比を変えたりはさすがにできないようです。
ズーム比が (browserZoomFactor の値が) 変わると、イベントが発行されます。それが 2 行目の BROWSER_ZOOM_CHANGE です。このイベントを拾えば、ブラウザのズーム比が変更されたら新しいズーム比に対応するコードを実行するという仕掛けがつくれます。
もうひとつの、Stage3D バックバッファを自動スケールさせる機能の方は、Context3D.configureBackBuffer() への引数の追加です。
6 番目の引数として wantsBestResolutionOnBrowserZoom が追加されました。デフォルトは false ですが、これを true にするとブラウザのズーム比に応じて自動的にバックバッファのサイズ変更が行われます。その時点でのバックバッファの幅と高さは Context3D の新しい属性 backBufferWidth と backBufferHeight から取得できます。
自動的にバッファサイズが変更されるのを止めたくなったら、wantsBestResolutionOnBrowserZoom の値として false を指定して、もう一度 configureBackBuffer() を実行します。
バックバッファのサイズは描画パフォーマンスと必要なシステムリソースに直接影響します。あまり大きくしたくない場合もあるでしょう。ということで、最大値を制限する属性が追加されています。Context3D.maxBackBufferWidth, Context3D.maxBackBufferHeight の 2 つです。
これら 2 つに指定した値は、自動サイズ変更に対してだけでなく、Context3D.configureBackBuffer() の引数にも有効になります。制限値より大きな値を width や height に指定して configureBackBuffer() を呼ぶと Bad Input Size エラーとなります。
デフォルトでは、maxBackBufferWidth と maxBackBufferHeight の値は、コンテンツを実行するシステムの最大値となっています。 (これよりも大きな値を設定することはできません)
なお、描画マスクとして ScissorRectangle を使用している場合、ScissorRectangle の大きさもバックバッファにあわせて変更されるようです。
モバイル環境での “Standard” プロファイルのサポート
Flash Player 14 / AIR 14 で追加された Stage3D の“Standard” プロファイルが、今回の更新でモバイル環境でも利用できるようになりました。いよいよ AGAL 2 が全ての環境で利用可能になります。使用条件は OpenGL ES3 のサポートです。
詳細は、Flash Player 16 / AIR 16 で追加された "Standard Constrained" プロファイルと合わせて別記事で紹介します。
その前に、次回は Flash Player 15 と Adobe AIR 15 のモバイル向け新機能をご紹介します。
コメントする