今年の MAX では Flash ランタイムの新機能、Stage3D が大きく扱われていました。従来の千倍のポリゴン描写ができるということで、新しい可能性が開けそうです。
でも、Stage3D により強化されるのは描画性能だけです。かつ、新しい書き方を覚えないとメリットを享受することができませんし、Flash なのにビットマップに縛られるのも窮屈です。
「Stage3D に不満な訳ではないけれど、これだけでは... 」 と思った人のために、MAX から Flash の今後についての情報です。
以下、ご紹介する項目は 2012 年公開を目標にしているものが殆どのようです。もちろん遅れることもあるでしょうし、機能が削られることもあると思います。ですが、もし、本当に以下の機能を揃えられのであれば、来年はずいぶんと楽しい年になりそうです。
Alchemy
Alchemy は C/C++ のコードを ActionScript に変換する技術です。しばらくプレビュー版が公開されていましたが、Flash Player 11 の発表時に製品版の開発が表明されました。 (Flash Player 11 と Adobe AIR 3 (と Alchemy)の発表)
Alchemy の特徴の一面は高速性です。
現状で Alchemy 経由で生成された ActionScript コードは、通常の ActionScript で記述されたプログラムの 10 倍以上速いというテスト結果があります。ネイティブコードと比べても 40% 程度の性能です。
製品版の Alchemy では、ネイティブコードの 80% を達成したいと考えているそうです。これでもう "Flash 遅い" とは言われることもなくなるでしょうか?
ストリーミング中継では伝わりきらなかったかもしれませんが、今年の MAX の 2 日目の基調講演の最後に紹介された Unreal エンジンによる描画は、明らかに他の 3D のデモとは次元の異なるものでした。 (個人的にはこのためだけでも MAX に来た甲斐があったかも)
おや?と思っていたら、「新しい C/C++ コンパイラを使っている」 というコメントがありました。つまり Alchemy (のおそらく製品版のプロトタイプ) を使って、Unreal エンジンを Flash Player 11 上で動作させていたという訳です。
それにより、Stage3D による描画に加えて、物理エンジンもネイティブコードに近いパフォーマンスが得られたということだとすれば、今後のゲームコンソールのあり方も変わってくるかもしれません。アドビがゲームにちょっと大げさなくらい入れ込んでいるのも分かる気がします。
ということで、Alchemy がもたらす一番の利点は、C/C++ の膨大なコード資産の再利用と言えるでしょう。C/C++ プログラムに 「write once, run anywhere」 をもたらす技術が Alchemy だという言い方もできるかもしれません。 (20% のオーバーヘッドを支払う代わりに、という但し書きは付きますが)
C から AS への変換効率も相当高いようです。Unreal エンジンの場合、描画に関係しないコードの 99% は、変換してそのままで利用可能な状態だったという話でした。
さらに、C/C++ で書かれた関数を ActionScrip から呼び出せるように変換する手段も提供されるようです。これで、最適化済みのオープンソースの C/C++ ライブラリが全て Flash 開発者のもの、ですね。
Unreal のデモは Flash Player 11 上で実行されていました。最適化さえ適切に (Alchemy 並みに) されていれば、現状の AVM2 でもゲーム専用機に迫る処理能力が出せる様なのですが、話はさらに続いて、
Tamarin redux と Halfmoon
Alchemy がいくら高速なコードを吐き出すといっても、扱えるソースコードは C/C++ 限定です。Flash 開発者としては、既存の C/C++ コードの利用というオプションが増えるとはいえ、AS コードの高速化の方が気になるところでしょう。
AS コード実行速度の改善の主役になりそうなのは、Tamarin redux と呼ばれている AVM (ActionScript Virtual Machine) の見直しプロジェクトです。
現在の Flash Player で使われている AVM の Tamarin は 6 年前に公開された頃の技術をベースとしていて、登場いらい大きな変更は行われていません。それをこれまでに蓄積されたフィードバックや最新技術を使って改良しようというのが Tamarin reduex です。
ご存知のとおり、Tamarin はオープンソースプロジェクトなので、全ての変更を Web で確認することができます。ちなみに Tamarin redux のプロジェクトサイトはこちらです。 (tamarin-redux)
(例えば、investigate speeding up Array/Vector access with numeric expressions では、配列やベクターの要素にインデックスでアクセスした時のパフォーマンス改善について議論されています。などなど結構面白いです)
さて、AS3 と Tamarin が登場した時、大幅なパフォーマンス向上の鍵となったのは、明確な型付けと JIT (Just In Time) コンパイラの導入でした。
ActionScript は本来インタプリタ上で実行される言語です。ActionScript のコードはコンパイラによって ABC と呼ばれるバイトコードに変換されて、VM 上で実行されます。
JIT は、このバイトコードを実行時にコンパイルしてマシン語を生成する方法です。実行中にコンパイルを行うため、当然その分負荷が増えます。しかし、マシン語の実行はバイトコードを VM 上で実行するより格段に速いため、適切に使えば全体の処理速度を向上させることが可能です。
Tamarin redux では JIT も最新の技術で作り直されるようです。コード名は Halfmoon です。Tamarin Redux の一部なので、上で紹介したサイトから詳細がトラックできます。
Halfmoon では、インタプリタ機能やコード生成機能の改善、新しい最適化機能の追加などが行われるようです。あわせて ABC の仕様の見直しもあるような雰囲気です。まだ具体的な性能は公開されていませんが、Tamarin Redux が最新の技術でスクラッチから構築された V8 のようなエンジンにどこまで迫れるか、楽しみです。
Tamarin Redux は実行環境の改良のため、SWF コンテンツがそのまま恩恵にあずかれるのも嬉しい点です。Unreal エンジンも今以上に速くなるのでしょうか。
Falcon
一旦ここで整理しておくと、Alchemy を使った時のおおざっぱなフローは以下のようになります。
C++ コード → Alchemy → AS コード → AS コンパイラ → ABC コード → JIT コンパイラ → マシン語
Alchemy を使わない場合はこんな感じです。
開発者 → AS コード → AS コンパイラ → ABC コード → JIT コンパイラ → マシン語
AS コードを誰が書くのかが違いということになります。とすると、頑張れば Alchemy にも勝てる??
上のフローの中で、まだ取り上げていないのは AS コンパイラと AS 言語ですが、このうち AS コンパイラについては、次世代コンパイラを全く新規に開発していることが、昨年既に公表されています。新しい AS コンパイラのコード名は Falcon です。
Alchemy が効果的なのは、高度に最適化された中間言語を元に AS コードを生成するためです。この最適化のノウハウの一部は、Falcon にも活かされるだろうと思います。一方、C/C++ が持つ最適化支援の機能が AS 言語に追加されるかは興味深いところです。 (inline なんてキーワードが追加されたり、とか)
さて、Falcon の目的としては、生成するコードの最適化だけではなくて、コンパイルのパフォーマンス改善も重要と位置づけられています。Java/C# のコンパイラと同等の性能を実現する見通しだそうで、現行の AS コンパイラとの比較では、インクリメンタルコンパイルが 10 倍以上速くなるそうです。
Alchemy が書き出した Unreal 3 エンジンの AS コードは数百万行だったという話なので、コンパイルには Falcon が使われていたのかもしれませんね。
このパフォーマンス改善のおかげで、従来は "パブリッシュした後にエラーを発見する" というフローだったのが、"コードの記述中にコンパイラがエラーを教えてくれる" というフローに変わりそうです。 (少なくとも Flash Builder ではそのようなデモがありました)
現在の AS コンパイラは、HW の CPU の数や使用可能なメモリ量に関わらず同じ動きをします。Falcon は利用できるリソースによって動作を変えるため、複数 CPU の HW を用意すれば、その分、コンパイル時間は短縮されます。
また、メモリ不足でコンパイル処理が落ちる、ということも無くなりそうです。512 MB あればどんな量のコードでもコンパイルできるような設計になっているそうです。
長くなったので、ActionScript が並列処理に対応する話など、は次回以降に。
ASがネイティブ並の速度になるとは嬉しすぎる。