Repository navigation
v1.19.2
v1.19.2 - Lua スクリプト for YMM4
従来エンジン(MoonSharp)の毎フレームのグローバル変数更新を高速化したパッチリリースです。スクリプトの書き方と実行結果は一切変わりません。高速ランタイム(LuaJIT)の実装にも変更はありません。
改善
毎フレームのグローバル変数更新のボックス化を除去
従来エンジンは実行のたびに obj / scene / ymm4 / グローバルの約 70 個の変数をテーブルへ書き込みます。この書き込みが object 型のインデクサ経由で、数値・真偽値のボックス化と型変換のディスパッチを毎回発生させていました。ソースジェネレーターの発行を型付きの Table.Set へ変更し、ボックス化と変換ディスパッチを削除しました。
- 数値は DynValue.NewNumber、文字列は DynValue.NewString の直接生成になります。
- 真偽値は MoonSharp が共有する DynValue の参照になり、割り当てが完全になくなります。
- obj.load / obj.copybuffer / obj.resize の後の寸法更新(obj.w 等の 8 個)も同じ形へ揃えました。
互換性・後方互換
- すべての変数の名前・型・値に変更はありません。ボックス化と変換ディスパッチの除去のみで、テーブルへ格納される内容は従来と同一です。
- 両エンジンの実行結果はバイト単位まで一致したままです。
- v1.19.1 までの構文拡張と既存の API に変更はありません。
内部実装
- 型付き発行は LuaApiGenerator が担います。更新メソッドの戻り値型(double / int / bool / string とその null 許容)から値種別を判定し、DynValue.NewNumber / NewBoolean / NewString を包んだ Table.Set を発行します。未知の型は従来のインデクサ発行へ残すため、後方互換は構造的に保たれます。
- 発行部 1 箇所の変更で全レジストラ(AviUtlGlobalRegistrar / SceneTableRegistrar / Ymm4TableRegistrar / obj テーブル)に波及します。個別の書き換えはありません。
- 数値の DynValue 生成自体は値が毎フレーム変わるため残ります。共有インスタンスの書き換えはスクリプトが参照を保持しうるため行いません。
- テストは 3366 件のまま全件成功です。ソリューションは x64 で 0 個の警告、0 個のエラーです。