preload
4月 27

SwfRuby を version-0.2.0 にバージョンアップして、AS変数の値の書き換えと、ムービークリップの入れ替えをできるようにしてみました。$ gem install swf_ruby でインストール可能。ruby-1.8.7, 1.9.2 で動作確認をおこなっています。ライセンスの変更はありません(GPL2)。インタフェースレベルでの後方互換性は確保しているつもりですが、swf_dumper の出力フォーマットが変更されていますので、このコマンドの実行結果をパースするような実装をされている方はご注意ください。

今回のバージョンアップにより、新たなコマンド、swf_as_var_replace, swf_sprite_replace が利用可能となります。それぞれ、AS変数の置換とムービークリップの置換を SWF のバイナリレベルでおこないます。バイナリ書き換えなので、非常に高速に動作します。

それぞれのコマンドの実装を読んでいただければ、アプリケーション内で書き換えをおこなう際の実装方法も、なんとなく掴めるかとおもいます。基本的な使用方法は、これまでのバージョン同様、元の SWF バイナリと、SwfRuby::ReplaceTarget オブジェクトの配列を SwfRuby::SwfTamperer に渡すという流れになります。

なお、手元の VM 環境では、20KB程度のベース SWF に対し、2件のAS変数と3件のムービークリップ(1KB未満のビットマップが貼ってあるだけのもの)の書き換えを1000回連続実行し、実行時間を測定してみたところ、0.252sec という結果が得られました(書き換え前後の SWF 素材を読出/書込するためのファイルシステムとのI/O時間は含みません)。1件当たり 1msec 以下での書き換えが実現できていることになります。

また、ムービークリップの差し替えができるようになったことにより、Jpeg 素材やビットマップ素材を、swftools などの外部ツールで SWF に変換しておくことで、画像変換処理のオーバーヘッドを事前に解決しておくことができるようになりました。ムービークリップの置き換えは、ステージに設置する際のインスタンス変数名を指定して、対象のムービークリップを差し替えるという処理になっていますので、ベースの SWF を制作する際にうまくルール決めができれば、同期的にRMagick(ImageMagick)を使用する必要すらありません。画像素材差し替え処理のコストを大きく削減することができるとおもいます。

やりたいことだけを実現するために、SWF 内要素の細かいパース処理など端折ったり、仕様を割り切ったりしている部分も残っています。適当にお楽しみくださいませ。

関連していそうなエントリ:

Comments are closed.