AIR 3.2 でデバイス向け Stage3D コンテンツを作成するときの注意点

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] のように記述する
  • オブジェクトは可能な限り再利用して、生成する数を最小化する

 

トラックバック(0)

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

コメント(6)

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を利用したアプリケーションの実行結果を私のブログで
書きましたので、よろしければご覧下さい。

コメントする

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