Skip to content

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 27 Jun 04:01
· 20 commits to main since this release

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)・rawlenanim.*rand / noise を含む)・
    obj.getpixel / setpixel / getpixeldata を実装し、従来エンジンとの出力一致を
    自動テストで検証
    しています(2800 件超のクロスエンジン等価テストを追加)。
  • ユーザースクリプトはサンドボックス環境で実行され、io / os / ffi / require
    などは従来どおり利用できません。

同梱物

  • 本プラグインには高速ランタイム(luajit.exe / lua51.dll)と実行スクリプトを同梱して
    おり、プラグイン本体と同じ native フォルダーに配置されます(手動インストールは不要)。