FlashPlayer10の3Dパフォーマンスを試す

というわけで、FlashPlayer10専用でこんなデモを作ってみました。

http://tanakahisateru.web.fc2.com/flash/fp10teapot/

行った先にはソースがあるので、初期化パラメータやレンダリングパスをいじって遊ぶことができます。Flex 4 SDKmxmlcにMain.asを食わせるだけ。超簡単。

一番ひっかかったのは、インタプリタで動くZソートでした。直感的にプログラムしただけだと、激しく重い。で、作業バッファをすべて単純な整数のVectorにして解決。原始型のVectorは、ObjectのArrayなんかとは比較にならないランタイム最適化が働きます。それでだいぶ稼げたとは思ったんだけど、ちょっと面が多くなると、やっぱりごっそり負荷を食います。そこで、ソート対象を刈り込むために、カリングしてからZソートしました。1/4ぐらい落とせたかな。

ただ、なんか、せっかくdrawTrianglesでネイティブ速度のカリングがあるのに、自前でカリングしたんじゃ意味なし…。たぶんdrawTrianglesは、カリング後にオプションで自動ZソートできるAPIにすべきだったんでしょうね。通常の用途で考えても、凹形状を描画したいニーズはあるだろうし。

あと、ピクセルシェーダはあるのに頂点シェーダがないのは、ちょっとどうかと思いました。並列化できるはずの頂点演算と転送に、かなりのコストがかかってしまいます。せっかく、drawTrianglesには「いっぺんに全頂点を送れる」という特徴があるのに、事前にスクリプトでループがいっぱい必要だと、その良さが活かせない。

三角形の描画そのものやDisplayObjectのピクセル合成は、将来的にGPUに持っていけば単純に高速化できそうな期待はできるけど、APIがないものはどうしようもないので残念です。というあたり、やっぱりFlashはFlashだなぁ。自分たちで十分にアプリケーションコードを書いて、リリースするまでにAPIを洗練するという習慣を身に着けてもらいたい…。

うーん、拡張するとすれば、graphics.autoSortedTriangles = true; とか?