仮想 GPU としての Stage3D

今回は、Stage3D 利用時の考慮点をいくつか紹介します。

一般的な GPU プログラミングは、OpenGL や DirectX の提供する API を使います。この方法は、ほぼ直接 GPU の機能を利用できるため、最大限のパフォーマンス実現が期待できますし、最新の GPU の機能だって利用可能です。

一方、Stage3D を使う場合は、1 つレイヤーが増えるため、直接 OpenGL や DirectX を利用する場合よりも余分な負荷が発生します。また、利用できる機能も限定されます。パフォーマンスや機能性の面からは、Stage3D は不利な感じです。

その代わり、Stage3D アプリは、複数の環境でそのまま動作することになっています。これは、Stage3D が環境間の差異を吸収してくれるるからです。

という見方からは、Stage3D は少し遅くて機能の限定された "仮想の GPU" と考えることができそうです。そして、利用できる開発言語は Context3D や Program3D のような ActionScript の API と、シェーダ記述用の AGAL ということになります。

GPU が仮想化されることの効果

Flash Player に、仮想 OS (AVM) に加えて、仮想 GPU が搭載されたことで、突然ブラウザ内でも GPU 並みの表現が可能になりました。アプリとして書き出せば、iOS でも Android でも Mac でも Win でも同じ機能が利用できます。

仮想 GPU の描画 (Stage3D) と仮想 OS の描画 (Stage) を柔軟に組み合せられるのも嬉しい点です。Stage3D は Stage の下に表示されるレイヤーなので、GPU 描画されたコンテンツの上に、今まで通り CPU 描画されたコンテンツを自由に表示できます。 もちろんパフォーマンスへの影響を考慮する必要がありますが、従来のコンテンツ制作の拡張として、GPU 描画を利用できるのは嬉しい点です。

また、OpenGL や DirectX を使う場合は、ハードウェア毎にチューニング作業を行ったり、特定のデバイスドライバのバグに対応したりといった、手のかかる作業が必要になったりしますが、Stage3D を使う場合は、個々のハードウェアに対する最適化やドライバのバグ対応は、仮想 GPU の実装作業の一部として、Flash Player や AIR の担当になります。そのため、開発者の責任が減ります。

とはいえ、デバイス環境とデスクトップ環境では、パフォーマンス特性がかなり異なります。また、デバイス環境では、機種ごとのパフォーマンスの差が大きいようなので、結局は多少なりとも個々に調整作業が必要になることでしょう。本当は、同じアプリがデスクトップでもデバイス上でもちゃんと動くと良いのですが。

Stage3D の制限

上で書いたように、Stage3D はデバイスでもデスクトップでも同じ機能を提供します。その代償として、提供される機能が、サポートされる環境の中で最も "スペックの低い環境"、すなわちモバイルデバイスを基準として決められています。

例えば、最新の GPU がサポートするシェーダモデルはバージョン 4 ですが、Stage3D がサポートするシェーダモデルは 2 です。そのため、AGAL から利用できるオプコードはプログラムあたり最大 200、レジスタは 8 までという制限がつきます。

また、デバイスでもちゃんと動くように、利用できるメモリサイズに対する制限も厳しく、

  • 頂点バッファは 256 MB まで
  • インデックスバッファは 128 MB まで
  • シェーダは 16 MB まで
  • テクスチャは 128 MB まで

とされています。

(ミップマップ等も含めたテクスチャ用のメモリは実際には 350 MB まで使えますが、多くのデバイスはそれだけのテクスチャ用メモリを持っていないため 128 MB が制限値とされています)

それから 1 回の present() の呼び出し毎に呼び出せる drawTriangles() の数は 32,768 個だそうです。 (present() と drawTriangles() については Stage3D と Context3D の描画手順をご覧下さい)

このように、Stage3D のシェーダで最新の GPU で使われるような複雑なプログラムを利用することはできません。また、描画データの大きさの制約からも、(特にデスクトップ環境では) 表現が制限される感じが強いかもしれません。

果たして、来年登場が予告されている Stage3D 2 では、古いハードウェアを切り捨てて、スペックアップする方向に行くのでしょうか?

複数の Stage3D インスタンスの使用

ところで、Stage3D は環境によって、複数利用できる場合があります。例えば、Stage3D を 2 つ利用できる場合は、stage.stage3Ds[0] と stage.stage3Ds[1] から Stage3D のインスタンスにアクセスできます。

// 2つのStage3Dインスタンスを取得する
stage3d_0 = stage.stage3Ds[0];
stage3d_1 = stage.stage3Ds[1];

それぞれの Stage3D は矩形のビューポートを持ちます。ビューポートの位置は Stage3D の属性、縦横の大きさは Context3D のバックバッファの属性として定義されます。 (Stage3D と Context3D の描画手順

ちなみに、Stage3D を複数使う場合、Context3D のインスタンスは Stage3D のインスタンスごとに作成します。

現在の Stage3D はレイヤー間のブレンドをサポートしないため、ビューポートが重なると、上の Stage3D で下の Stage3D の重なった領域が隠されます。stage3Ds 配列内のインデックスが大きい Stage3D ほど上に表示されます。 (上のサンプルコードの場合だと、stage3d_1 が上、stage3d_0 が下)

利用できる Stage3D の数は環境に依存します。そのため、複数 Stage3D の利用を前提としたコンテンツ制作には注意が要りそうです。

 

トラックバック(0)

トラックバックURL: http://cuaoar.jp/mt4/mt-tb.cgi/222

コメント(2)

>アプリとして書き出せば、iOS でも Android でも Mac でも Win でも同じ機能が利用できます。

モバイルでのStage3Dに結構期待してるのですが、Air3.1ではまだ動作しませんよね?

ところで、Air3.2βのページのキャッシュで「If you want to participate to the prerelease for Stage3D on mobile, please register for the Flash runtimes prerelease program」という記述を見つけたのですが(現在のページにはない模様)この件に関してなにかご存じありませんでしょうか?

もし情報お持ちでしたら教えていただきたいです。

mt_kuso さん、こんにちは。

コメントありがとうございます。
私も期待大なのですが、どうも常に「GPU = 高速」 というわけでも無いようです。
特に、モバイル環境ではその傾向が強いようです。
結局開発者のノウハウ次第に落ちつくのかもしれません。

お問い合わせの件ですが、現在プレリリースプログラムの募集はしていないようです。
やるつもりだったけれど開発が遅れた、という辺りではないかと推測してます。

コメントする

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261