v1.3.0
v1.3.0 - Lua スクリプト for YMM4
ピクセル操作スクリプトを大幅に高速化したリリースです。
obj.getpixel / obj.setpixel / obj.getpixeldata を使うスクリプトは、同梱した高速
ランタイム(LuaJIT)で自動的に実行されるようになり、内部計測では最大で数十倍
(例:1920×1080 のフルフレーム加工で約 41 倍、小さめの画像では 70 倍前後)の
高速化を確認しています。
新機能・改善
1. ピクセル操作スクリプトの自動高速化
ピクセル操作 API(obj.getpixel / obj.setpixel / obj.getpixeldata)を含むスクリプトは、
特別な記述なしで自動的に高速ランタイム(ネイティブ実行)へ振り分けられます。
変形のみ(座標・回転・拡縮・不透明度)のスクリプトは従来どおりの実行系で動作します
(変形のみの処理は元々十分高速なため、速度差はありません)。
ネイティブ実行は専用の別プロセスで行われ、ピクセルバッファは共有メモリ経由で
受け渡されます。スクリプトが無限ループに陥っても、5 秒のタイムアウトで強制終了
され、本体が固まることはありません(終了後は自動的に復帰します)。
2. 実行エンジンを指定するディレクティブ
スクリプトの先頭行に次のディレクティブを書くことで、実行エンジンを明示指定できます。
--!native… 高速ランタイム(LuaJIT)で実行--!moonsharp… 従来エンジン(MoonSharp)で実行- 記述なし … ピクセル操作を含む場合は自動的にネイティブ、それ以外は従来エンジン
3. bit32 の Lua 5.2 準拠化(ネイティブ実行時)
ネイティブ実行時の bit32 ライブラリは、正しい Lua 5.2 の挙動になりました。
実用域(0〜2^31 未満の値、0〜31 のシフト量)では従来と完全に一致するため、
通常のスクリプトの見た目は変わりません。bit32.lshift(1, 32) のような範囲外の
特殊なケースのみ結果が変わります(ネイティブ=正しい 0、従来=1)。
4. 変形処理のアロケーション削減
毎フレームの実行で発生していた一時オブジェクトの確保を削減し、シーンオブジェクトの
解決を遅延化しました。長時間の出力における GC 負荷を軽減します。
注意事項(ネイティブ実行時の制約)
obj.getobjectはネイティブ実行では使用できません(常にnilを返します)。
他オブジェクトの参照を行うスクリプトには--!nativeを付けないでください
(ピクセル操作と併用する場合は--!moonsharpを明示してください)。math.randomは両エンジンとも「フレーム番号でシードし直す決定論的乱数」ですが、
乱数列の実装が異なるため、エンジンをまたぐと同じシードでも値が変わります。
エンジンに依存しない乱数が必要な場合はanim.rand(min, max, seed)を使用してください。- ネイティブ実行は最初のピクセルアクセス前から GPU→CPU の画像転送を行います。
内部実装
- 同梱した LuaJIT を別プロセスで常駐させ、名前付き共有メモリとイベントで往復します。
タイムアウト時はプロセスを強制終了し、自動的に再起動します。 - ネイティブ側に
bit32(正しい 5.2)・rawlen・anim.*(rand/noiseを含む)・
obj.getpixel/setpixel/getpixeldataを実装し、従来エンジンとの出力一致を
自動テストで検証しています(2800 件超のクロスエンジン等価テストを追加)。 - ユーザースクリプトはサンドボックス環境で実行され、
io/os/ffi/require
などは従来どおり利用できません。
同梱物
- 本プラグインには高速ランタイム(
luajit.exe/lua51.dll)と実行スクリプトを同梱して
おり、プラグイン本体と同じnativeフォルダーに配置されます(手動インストールは不要)。