エクスポートすると高速ループが遅い件

以前から高速ループの処理の遅さは気になっていたのだけど、エクスポータ使うと更に遅くなるケースがある。

SWF はこの傾向が顕著で基本的には解像度とかにもよるのだけど 60 FPS をブラウザでグイんグイん動かそうという場合、高速ループ使いまくると、まぁだいたい上手くいかない。Java 出力のほうがマダ速いなんてこともあったくらいだ。


英語版はそこで ForEach を使えばだいぶ問題が改善されるのだけど日本語版はいまのところ高速ループ以外の選択肢はない…と思っていたが、AdvancedGameBoardObject (以下 AGBO と略)のExtraLoop 機能を使うと高速ループよりも早い処理が可能だった。

本来は配列要素に対するループ処理だけど、AGBO は固定値を保存できるのでこの機能を使うとやや強引にだが登録されたオブジェクト・インスタンスに対してループ処理を行うことができる。今回は 8 ✖ 8 マスで、合計 64 個のオブジェクトにポジション変更の命令を出しているわけだが高速ループ使うと SWF ではこれが致命的に重くなる。AGBO と ForEach なら SWF でも実用的な速さを維持できている。

結構差が出る良い出力サンプルが作れたのでとりあえず例を出しておこうと思う。サンプルは出落ちなので操作不要。速さは体感できるくらいの差が出ているからすぐ分かると思う。

サンプルダウンロード:高速ループ版

サンプルダウンロード:ForEach 版

サンプルダウンロード:AGBO 版

ForEach は CF2.5 から標準機能となるので日本語版ユーザも基本的には CF2.5 以降は英語版との差に悩まされるようなことは無くなるだろう。エクスポータとの互換性を維持して作るためにはこれまで高速ループ以外手段が無かったわけだけど、ループ処理に関しては ForEach でいくらか自由度が増すので既存の日本語版 MMF2 ユーザは CF2.5 に期待して良いと思う。

また今回国内ではまだあまり便利さが知られていないであろう AGBO の拡張ループ機能に触れたわけだが、速度的にも高速ループより有利だと分かったので、各エクスポータで共通してサポートされている半標準機能的なオブジェクトは使い方がわからないと言って放置するより時間掛けて使い込んでみると思わぬ発見があったりするので面白い。とくに配列要素を扱う場合は、ゲームジャンルがパズルじゃなくても AGBO は結構使えるエクステンションだと思う。