2012年7月3日火曜日

QuadBatchで早くなるか試してみた

QuadBatchを使うとBenchmarkシーンの結果が本当によくなるか試してみました。


結果:

Nexus One: 380 (370) -> 350 (350) // なぜか若干低下?
iPhone 4: 530 (220) -> 760 (400) // 43% アップ
プロジェクタ: 4410 (1160) -> 7110 (1740) // 61% アップ

※すべてリリースビルドでテストしました。
※カッコ内の数字は開発ビルドでの結果です(iOS用のパッケージ化方法は標準)。
※プロジェクタはデバッグ版でWindows 7環境です。
※FPSの設定は、デバイスのNexus OneとiPhone 4は30fps。プロジェクタは60fps。

全体的には確かにパフォーマンスがよくなりましたが、Nexus Oneで若干低下しました。今回のベンチマークテストでは画像がずっと回転しているので、毎フレームでquadBatch.reset()してすべてのオブジェクトをquadBatch.addImage()し直す必要があったなど、ActionScriptで処理することが逆に増えたということが、裏目に出たのかもしれません。

ところで、パフォーマンスチェックは「リリースビルドでやるべし!」ですね。通常の開発ビルドだとまったく本来のパフォーマンスがでないようですね。Flash Builderの実行構成ウィンドウでは、iOS用のパッケージ化方法「標準」はリリースビルドと同等のパフォーマンスだという説明がありますが、これは正しくないみたいですね。

ただ、これもNexus Oneは例外的で開発ビルドとリリースビルドの差がほとんどありませんね...

ちなみに、Webに公開するアプリを前提にしたパフォーマンスチェックするなら、"デバッグ版じゃない"Flash Playerでテストするべきなんですが、このベンチマークテストでは、パフォーマンスが良すぎて結果が出るまで時間がかかり過ぎますし、今回のQuadBatch版では、仕様上の限界に達するのかエラーになって止まってしまいます。どうもContex3Dで「ArgumentError: Error #3670: Buffer too big.」というエラーが出てるようです。この投稿によると、ひとつのQuadBatchに追加できるImage(Quad)の限界は8192個のようです。

最後に、今回試したBenchmarkScene2.asのソースです。

2012年7月2日月曜日

Starling公式デモアプリの補足情報

Ctrl/Cmd & Shiftキーとマウスの組み合わせでマルチタッチ操作をシミュレーションできることは前にも触れましたが、これはStarlingのフレームワークの機能です。StarlingクラスのプロパティsimulateMultitouchをtrueに設定するとその機能が有効になります。

それ以外にも、このデモアプリではキー操作による(画面上では説明がないちょっとした隠し)機能が用意されています。

スペースキーを押すと

FPSとメモリ使用量を画面左上に表示します。もう一度押すと消えます。

負荷をできるだけ抑えるためでしょうが、Flashでよく使われるStatsと比べるとかなりこじんまりしています。ちなみにRetinaディスプレイのiPhoneだと顔を近づけないと読めないぐらいの小ささになります。

使われているフォントはminiというビットマップフォントで、>Starlingのフレームワークに唯一付属しているものです。何か画面上にデバッグ情報を表示するような場合にもこのフォント使えば負荷を抑えられていいかもしれせん。

xキーを押すと

Starlingが使用しているContext3Dを開放します。これによりStarling.handleLostContextの設定によるアプリの挙動を確認できます。このデモアプリではhandleLostContext=trueになっているので、フレームワークによりContext3Dがすぐに再生成され画面上では変化が分かりません。描画の更新が一時的に遅延するぐらいです。

見た目で分かりやすりのは、Render Textureシーンでです。xキーを押すと書いていた絵が消えます。

RenderTextureクラスの注意書きにもcontextが消失したら復元できないとあります。RenderTexteはGPUのメモリ上でダイレクトに描画処理を行うため、Context3Dがなくなると復元するための情報が残っていないということなんでしょう。恐らくActionScriptで別に情報を保持しておいて、Context3Dが再生成されたときのイベント(context3DCreate)をキッカケに再度RenderTexteに描画し直せば、復元できるかもしれません。

ちなみにスペースキーとxキーのハンドリングはGameクラスのここで行なっています。

ATF(Adobe Textutre Format)について

StarlingのデモアプリにはATFが使わているのに、ATFを生成するツールがまだ一般に公開されていないという状況が続いてましたが、エンコーダー/デコーダー機能を持つ、AS3で書かれたオープンソースのライブラリATF-Encoderが公開されました。

また、ByteArray.orgのThibaultさんの投稿によると、まもなくAdobe LabsにATFのツールが公開されるとのことです。ATFを使うとレンダリングが早くなったり、メモリー必要量が減ったりするようです。GPUをより効率的に使えるみたいですね。