AIR 3.2 から、デバイス向けのコンテンツでも Stage3D が利用できるようになります。明日のイベントでも紹介されると思いますが、相当性能はよいようです。
さて、AIR 3.2 の Stage3D をデバイスで使うには、今までになかった注意点がいくつかあります。以下、現在公開されている内容を説明します。
1.SWF バージョンの指定
パブリッシュ時の SWF のバージョンは 15 を指定します。
- Flash Professional をご使用の場合は、以下の記事の "AIR 3 の設定" の箇所をご覧ください。バージョン指定が 15 になる点だけ異なります。 (Flash Professional CS5.5 で Flash Player 11 と AIR 3 を使う方法)
- Flash Builder の場合は、AIR 3.2 SDK を指定して、コンパイラの引数に -swf-version=15 を追加します
2.アプリケーション記述ファイル間連
- 名前空間を 3.2 に変更します。application タグを以下のように記述します。
<application xmlns="http://ns.adobe.com/air/application/3.2">
- 描画モードに direct を指定します
<renderMode>direct</renderMode>
- カメラを使用しない Android アプリでは、カメラ利用を不許可に設定します。カメラ使用が許可されていると、実際にはカメラが使用されていない状態でも、フレーム毎に画面とカメラの画像の合成が行われます。これがパフォーマンスに大きく影響するためです。
<android> <manifestAdditions> <![CDATA[ <manifest> <!-- 以下の行を削除、またはコメントアウトする <usespermission android:name="android.permission.CAMERA" /> --> </manifest> ]]> </manifestAdditions> </android>
- 新しく追加されたタグ <depthAndStencil> を必要に応じて設定します。デフォルト値は false、すなわち、深度バッファやステンシルバッファを使用しない、という設定になっているため、殆どの 3D コンテンツでは true を指定することになると思われます。iOS デバイスなどの Imagination Technologies の GPU をベースとする機器では false に設定した方が高速のため、2D コンテンツでは、本当に必要な場合を除き false のままにしておくのがお勧めのようです。
<initialWindow> ... <depthAndStencil>true</depthAndStencil> </initialWindow>
false が設定されている状態で、アプリが context3D.configureBackBuffer() からバッファを操作するとエラーとして扱われます。Context3D.enableErrorChecking が true に設定されていると、このエラーを見ることができます
3.アプリ制作時の注意点
- 断片シェーダの計算精度が highp から mediump に変更されました。 (頂点シェーダは highp のままです) そのため、断片シェーダのレジスタが使う値 (テクスチャの座標など) の範囲が、mediump の領域を超えないようにする必要があります。具体的には、
- Highp : 浮動小数点型 -2^62 ~ 2^62、整数型 -2^16 ~ 2^16
- Mediump :浮動小数点型 -2^14 ~ 2^14、整数型 -2^10 ~ 2^10
- Stage3D の上に CPU 描画を重ねて表示する場合、両方の描画処理が Stage3D の描画と同期するように変更されました。これは、Stage3D 利用時には、Context3D.present() が呼ばれないと、画面が一切更新されないということです。もちろん、タイムラインアニメーションやテキスト入力も影響を受けます。CPU 描画を画面に反映させるには、1.Context3D.present() を呼ぶ、2.Context3D を破棄する、3.stage3D.visible 属性を false に設定する、のどれかが必要です。
- <autoOrients>true</autoOrients> の設定をして、Android デバイスを回転させると、一旦 Context3D が破棄されて、新しく作り直されます。他にも、GPU が利用できない状況が起きると、同様の動作が行われます。Context3D が作り直しになった場合は、描画に必要な情報は失われてしまいます。そのため、Event.CONTEXT3D_CREATE イベントリスナを使って、テクスチャや頂点バッファなどの必要な情報を再びアップロードするように記述が必要です。これをサボると、画面を回転させたら表示が変、ということになってしまうかもしれません。
4.デバイスのパフォーマンスに関するガイドライン
一般
- Imagination Technology のチップは、幅や高さが 2 の階乗もしくは 8 の倍数以外のビットマップをアップロードすると、天昇処理が低速モードになります
- 何種類もの GPU で、たくさんアルファブレンドを使うと遅くなることが分かりました
- 大きな背景用の画像を使うのは、小さないくつかのイメージをタイル上に並べるよりもずっと低速になることがあります
- Stage3D のパフォーマンステスト結果を、表示リストを使って表示するとき、表示リストの更新頻度は、少なくとも Stage3D コンテンツの百分の一以下にするか、テスト終了後まで待つことをお勧めします。これは、表示オブジェクト更新による影響が大きいためです
- 必要の無い限り、<autoOrients>false</autoOrients> をアプリケーション記述ファイルに指定して、自動的にアプリの向きが変わらないようにします。これは、Context3D の切り替えによる負荷が非常に高いためです。向きの変更は、アプリケーションのロジックで対応することを考えてみてもよいでしょう
- パフォーマンス測定時には、デバッグモードの SWF は使用しないようにしましょう
- パフォーマンス測定時には、Context3D.enableErrorChecking を false に設定しましょう。
Android
- Tegra2 を搭載するデバイス (Galaxy Tab 10.1 や Xoom など) では、colorDepth を 16bit に設定すると、パフォーマンスが大幅に改善される
<android> <colorDepth>16bit</colorDepth> <manifestAdditions>...</manifestAdditions> </android>
iOS
- パフォーマンス測定時には、-ipaappstore でコンパイルする。または、リリースビルトとして書き出す
ActionScript
- 配列の操作には for ループとインデックスを使う。 for in や for each の使用は避ける
- iOS では、vec[3 + 4] のような記述は避けて、vec[7] のように記述する
- オブジェクトは可能な限り再利用して、生成する数を最小化する
Flash Player 11.2 and AIR 3.2 Release Notes (Adobe Labs Public Beta)のリリースノート
Known Issues
(3082509) Stage3D: Render to texture is not available on iOS.
実際にiPodTouch(第4世代 iOS5)で試したみた所、
テクスチャを利用すると起動はしますが
画面が真っ白のままです。(エラーで落ちているのかもしれません)
テクスチャを利用しないものであれば、起動できました。描画処理は早いと思います。
ようやく来ましたね、記事を参考にパッケージングしたところ私の環境(第4世代iPodTouch・GalaxyS2)では無事描画できました。
Androidのほうは結構高速に描画できるのですが、音の遅延が改善されてないのが残念でなりません。これがなければゲーム開発に使えそうなんですが・・・。
marbayclip さん、こんにちは。
リリースノートのバグは修正済みのようなので (ドキュメントが古い模様)、バグだとすれば別件かもしれません。enableErrorChecking で情報が取れたりはしないでしょうか?
mt_kuso さん、こんにちは。
音に関しては、11.2 の次の "Ciril" で改善が予定されているようです。
今年前半の公開が予定されるバージョンなので、ちょっと間に合わなかったのかなという感じです。
こちらの記事とStarlingの記事を参考にさせていただき、会社のGalaxyS、GalaxyS2、GalaxyNexus、003Pで表示させてみたところ、GalaxyS2のみ一瞬だけ表示されて背景のみになるという現象が・・
描画処理が早いだけに、リリース版での安定を期待しています。
ackieさん
画面が真っ白のままだったアプリは、アプリケーション定義ファイル内のの
設定をミスしてしまったようです。
BunnyMarkというStage3Dを利用したアプリケーションの実行結果を私のブログで
書きましたので、よろしければご覧下さい。