東京てら子が久しぶりに開催されましたので、その為のネタとして、AlchemyでTweenエンジンを実装してみました。名づけて、AlTween。
AlchemyはC/C++言語をAVM2上で動作可能にする環境(詳細は
ここをご参照ください)なのですが、AlchemyのコードとActionScriptのコードのやり取りのオーバーヘッドが大きく、使いどころを間違えるとむしろ遅くなってしまいます。
恐らく、出た当初に味見して、あまりの遅さに愕然とし、もう二度と触っていない人も多いことでしょう。Adobeのサイトも全く盛り上がっていません(笑)。
しかし、やり取りのオーバーヘッドを回避する為にAlchemyで確保したメモリーをByteArrayとしてAS3のコードから直接参照する技を使えば、粒度の大きいデータを大量に演算する用途にはある程度使えるような感触を得ることが出来ました。
てら子ではAlTweenのベースにしたTweenエンジンである
KTweenとパフォーマンス的にどっこいどっこいだったのですが、その後最適化を進めた結果、KTweenは完全に超えました。ただ、その時にうまく動作させられなかった我らが
BetweenAS3と比較したところ、BetweemAS3が最速という結果に・・・
で、更に最適化を進めた結果、BetweenAS3とパフォーマンスはほぼ同等なところまで持って行くことができましたが、AlTweenはメモリーを事前に確保する関係で、予めTweenさせる最大のオブジェクトプロパティ数を決めておかなければならない点や、柔軟なTweenリストを構成できる点などを考えると、最強のTweenエンジンはやはりBetweenAS3でしょう。
ま、今回はあくまでも技術的な興味で実装しただけで、実用性まで考えてたわけではありません。ただ、C言語で記述するコードの最適化KnowHowがまだ確立されていないので、もしかしたらもっと速いコードを書く事は可能なのかも知れません。
自分が試した範囲では、関数ポインターは使った方が遅かったです。あと、リンクリストとfor文ではあまり速度差は出ませんでした。とは言え、リンクリストはポインターのやり取りをAlchemyとAS3間で行うと、また遅くなってしまうので、オフセットをByteArray中に埋め込むというかなりトリッキーな実装をしたので、そもそも実装がまずかった可能性も否めません。
AlTweenと速度比較用のベンチの
ソースコードはSpark projectの方にアップしておきましたので、ご興味のある方はいろいろいじって遊んでみてください。
また、東京てら子での発表資料は
こちら(swf形式)です。