Releases: routersys/YMM4-LuaScript
v1.9.2
v1.9.2 - Lua スクリプト for YMM4
スクリプトのエラーを、スクリプトエディタ上で視覚的に把握できるようにしたマイナー
リリースです。コンパイルエラー・実行時エラー・タイムアウトが発生すると、該当箇所に
赤い波線が表示され、ポイントするとローカライズされたエラー内容がツールチップで
確認できます。従来のエラー時挙動(当該フレームは元の状態を出力し、内容をログへ出力)は
変わらず、波線表示はそれに加わる UI です。
新機能・機能改善
1. エラー箇所への赤い波線表示
スクリプトの実行でエラーが発生すると、スクリプトエディタの該当箇所へ赤い波線を
表示します。エラーが明示的に伝わるようになり、原因箇所を素早く特定できます。
- 対象は、コンパイルエラー・実行時エラー・実行タイムアウトです。
- エラーの行・列は実行時のエラーメッセージから解析し、その位置へ波線を描画します。
- 位置を特定できないエラー(タイムアウト等)は、スクリプト先頭行に表示します。
2. エラー内容のツールチップ表示
波線部分にマウスポインタを合わせると、エラー内容をツールチップで表示します。
- 先頭にエラー種別(構文エラー / 実行時エラー / タイムアウト)を表示し、続けて
エラーメッセージ本文を表示します。 - エラー種別の表記は全 8 言語(日本語・英語・簡体字中国語・繁体字中国語・韓国語・
スペイン語・インドネシア語・アラビア語)にローカライズされています。
3. AviUtl 互換セクション使用時の行位置補正
--dialog: / --param: ヘッダを用いた AviUtl 互換スクリプトでは、実行用コードへの
変換時に行番号がずれますが、変換時の行マッピングを保持して元スクリプト上の正しい行へ
波線を表示します。
互換性・後方互換
- エラー発生時の処理結果(当該フレームでは座標・透明度・回転・ピクセルの変更を
適用せず、元の状態をそのまま出力し、内容をログへ出力する)は従来どおりです。
波線表示は加算的に働く UI であり、レンダリング結果には影響しません。 - スクリプト言語・実行エンジン(MoonSharp / LuaJIT)・入力補完・折り畳み・テーマ
連動など、エディタの既存挙動は変わりません。 - 波線を描画できない環境であっても、エディタの動作や既存挙動には一切影響しません。
内部実装
- 診断情報はスクリプト本文をキーとする診断サービスを介して受け渡し、フレームワークの
コードエディタを再利用したまま、AvalonEdit の背景描画(IBackgroundRenderer)で
波線を描画します。専用エディタの新設は行いません。 - エディタの
TextView参照は、折り畳み戦略フックが受け取るFoldingManagerから
型ベースのフィールド探索で解決します。フィールド名の変更に耐性があり、解決できない
場合は波線表示を無効化するのみで他の挙動には影響しません。 - 診断サービスの購読は弱参照で行い、エディタを閉じた際のメモリリークを防ぎます。
描画スレッドからの通知は UI スレッドへマーシャリングして再描画します。 - エラー種別のローカライズ文字列を 3 件、全 8 言語へ追加しました。
v1.9.1
v1.9.1 - Lua スクリプト for YMM4
チェック(check0〜check3)とカラー(color)を、AviUtl 互換の --check/--color
ヘッダ宣言だけでなく、スクリプト本体で参照するだけでエフェクトパネルへ自動表示できる
ようにしたマイナーリリースです。トラックバー(track0〜track3)と同じ感覚で、必要な
入力欄だけを -- ヘッダ無しで出せます。既存のヘッダ宣言・トラック常時表示の挙動は
変わりません。
新機能・機能改善
1. check / color の参照による UI 自動表示
スクリプト本体で obj.check0〜obj.check3 や color を参照すると、対応する
チェックボックス・カラーピッカーがエフェクトパネルへ自動的に表示されます(参照を
消すと非表示に戻ります)。AviUtl 互換時と同じ動的表示機構をそのまま用いており、
-- ヘッダを書かずに必要な入力欄だけを出せます。
- トラックバー(track0〜track3)は従来どおり常に表示されます。
- この一般利用では
--引数による範囲・既定値の宣言を伴わないため、値の範囲は
スクリプト内で扱います(クランプは行いません)。 - 参照表示したカラーピッカーの値は
colorとしてスクリプトへ供給されます。 - AviUtl 互換の
--track/--check/--colorヘッダによる宣言表示は従来どおり
利用できます。
2. 入力補完への登録
スクリプトエディタの入力補完候補に obj.check0〜obj.check3 と color を追加し、
トラック(obj.track0〜obj.track3)と同様に補完できるようにしました。
互換性・後方互換
- ヘッダ宣言時の表示やトラックバーの常時表示など、既存の挙動は変わりません。
- 参照検出は、ヘッダ(
--)を用いない一般利用時にのみ加算的に働きます。
内部実装
- 参照検出は既存の Lua 字句解析器(
LuaLexer)を再利用し、文字列・コメントを除外
した正確な検出を行います(カスタム UI の新設なし)。 - 全 8 言語(日本語・英語・簡体字中国語・繁体字中国語・韓国語・スペイン語・
インドネシア語・アラビア語)のドキュメントへ、本挙動を追記しました。
v1.9.0
v1.9.0 - Lua スクリプト for YMM4
純粋なピクセル写像スクリプトを構文解析で検出し、CPU(式ツリー)または GPU
(Direct2D ピクセルシェーダ)へ実行時コンパイルして高速化する三層ルーティングを
追加したリリースです。従来エンジン(MoonSharp)と高速ランタイム(LuaJIT)の挙動は
変わらず、非対応のスクリプトは自動的に従来の経路へフォールバックします。あわせて
全 8 言語のドキュメントを更新しました。
新機能・機能改善
1. ピクセル写像カーネルの自動検出と高速化
for y … for x … obj.getpixel … obj.setpixel … end end の形をした、自ピクセル
完結のピクセル写像を構文解析で検出し、中間表現(IR)へ変換したうえで高速なカーネル
として実行します。ディレクティブを書かなくても、該当するスクリプトは自動的に CPU
カーネルへ振り分けられます。
- 対象は純粋な自ピクセル写像(色変換・グレースケール・ガンマ・しきい値・チャンネル
混合など)に限られます。四則演算・math.*・比較・しきい値の「条件 and 値1 or
値2」・local変数のみを使用し、処理中の自ピクセルとobj/scene/time
等の値だけを参照する場合が対象です。 - 近傍参照(ぼかし等)、別座標への書き込み、
getpixeldata、getobject、テーブル/
文字列操作、if文などを含む場合はカーネル化されず、自動的に従来エンジンで
実行されます。
2. CPU カーネル(式ツリー)
検出したカーネルを実行時に式ツリーへコンパイルし、Parallel.For で全 CPU コアへ
並列展開して実行します。getpixel / setpixel と同一の乗算済みアルファ演算・
floor 剰余を厳密に再現するため、出力は従来エンジン(MoonSharp)とビット単位で
一致します。インタプリタ呼び出しのオーバーヘッドが無くなり、大幅に高速化されます。
- スクリプト先頭行に
--!cpuと書くと CPU カーネルを明示指定できます。
3. GPU カーネル(Direct2D ピクセルシェーダ)
同一の中間表現から HLSL を生成し、Direct2D のカスタムピクセルシェーダとして実行
します。画像が GPU 上にあるまま処理するため GPU→CPU 転送が不要になり、全ピクセルが
並列実行されます。
- スクリプト先頭行に
--!gpuと書くと有効化されます(オプトイン)。 - float32 精度で計算するため、結果は従来エンジンとごく僅かに異なり得ます。厳密な
一致が必要な場合は CPU カーネル(--!cpu)を使用してください。 - シェーダの初期化・コンパイルに失敗した場合は、CPU カーネル、さらに従来エンジンへ
自動的にフォールバックします。
4. 実行エンジン指定ディレクティブ
スクリプト先頭行のコメントで実行エンジンを明示指定できます。
--!cpu… CPU カーネル(式ツリー、厳密)--!gpu… GPU カーネル(Direct2D ピクセルシェーダ、float32)--!native… 高速ランタイム(LuaJIT、別プロセス)--!moonsharp… 従来エンジン(MoonSharp)
ディレクティブが利用不可・非対応の場合は、出力を壊さずに下位のエンジンへ自動で
フォールバックします。
互換性・後方互換
- ディレクティブを書かない通常スクリプト(座標・回転・不透明度の変形など)は
従来どおり MoonSharp で実行され、挙動は一切変わりません。 - ピクセル写像に該当しないピクセル操作スクリプトは、引き続き高速ランタイム
(LuaJIT)で自動実行されます。 - CPU カーネルは MoonSharp とビット単位で一致するため、自動振り分けによって既存
スクリプトの出力が変わることはありません。
内部実装の最適化(リファクタリング)
新機能は、一つの中間表現から複数バックエンドを出し分ける統一設計の下で実装しました。
- カーネルコンパイラ基盤
- Lua 部分集合の字句解析器・構文解析器・AST を新設し、純粋ピクセル写像を検出して
中間表現(IR)へ降ろす抽出器を実装しました。同一の IR から CPU(式ツリー)と
GPU(HLSL)の両バックエンドを生成します。 - GPU カーネルは YMM4 本体と同一のカスタムピクセルシェーダ機構(Direct2D /
D3DCompiler)に準拠して実装し、定数バッファ経由で各フレームの値を渡します。
- Lua 部分集合の字句解析器・構文解析器・AST を新設し、純粋ピクセル写像を検出して
- 三層ルーティングとキャッシュ
- スクリプト本文をキーにコンパイル済みカーネルをキャッシュし、初回フレームのみ
コンパイルコストを払います。判定は「GPU 指定かつ適合 → GPU」「適合 → CPU」
「その他のピクセル操作 → ネイティブ」「それ以外 → MoonSharp」の順です。 - 非対応・初期化失敗時は下位のエンジンへ縮退するため、出力が壊れることはありません。
- スクリプト本文をキーにコンパイル済みカーネルをキャッシュし、初回フレームのみ
- ドキュメントの同期
- 日本語・英語・簡体字中国語・繁体字中国語・韓国語・スペイン語・インドネシア語・
アラビア語の全 8 言語へ、実行エンジン指定と自動高速化の節を追加しました。
- 日本語・英語・簡体字中国語・繁体字中国語・韓国語・スペイン語・インドネシア語・
v1.8.0
v1.8.0 - Lua スクリプト for YMM4
AviUtl 互換の描画合成・メディア読み込み・値/オプション API を新たに実装し、
従来エンジン(MoonSharp)と高速ランタイム(LuaJIT)の両方で対称に動作させた
リリースです。あわせて全 8 言語のドキュメントを実装状況へ同期しました。
新機能・機能改善
1. 描画合成 obj.draw / obj.drawpoly
オブジェクト画像を蓄積バッファへ重ねて合成する描画 API に対応しました。
残像・パーティクル・敷き詰めなど、複数回の描画を伴う表現が利用できます。
obj.draw([ox, oy, oz [, 拡大率 [, 不透明度 [, アスペクト]]]])で、現在の
オブジェクト画像を任意のオフセット・拡大率・不透明度で合成します。複数回
呼び出すと重ね描画されます。obj.drawpoly(...)で 4 頂点へオブジェクト画像をテクスチャ描画します。UV
指定による部分描画、UV を省略した不透明度のみ指定(座標 12 個 + 不透明度)に
対応します。アフィン変換で写像します。obj.setoption("antialias", ...)の指定が描画時の補間(最近傍/線形)へ
反映されます。- いずれかの描画 API を呼び出すと標準描画は抑制され、合成結果が出力されます。
2. メディア読み込み obj.load("text" / "image" / "movie") と obj.setfont
obj.load の対象を図形("figure")のみから、テキスト・画像ファイル・動画
ファイルへ拡張しました。
obj.load("text", 文字列):obj.setfontで指定したフォント・サイズ・
スタイル・色で文字列を描画します(DirectWrite)。obj.load("image", パス):画像ファイルを読み込みます(WIC)。obj.load("movie", パス [, 時間]):動画の指定時間のフレームを読み込みます
(Media Foundation)。- 読み込み後は
obj.w/obj.h等が生成サイズへ更新され、obj.load直後の
getpixelでも参照できます。
3. バッファ操作 obj.copybuffer
バッファ間で画像をコピーする obj.copybuffer(コピー先, コピー元) に対応しま
した。"obj"(オブジェクト画像)・"tmp"(一時バッファ)・"cache:名前"
(フレーム間で保持する名前付きキャッシュ)を識別子の先頭文字で判定します。
4. 値・オプション API
スクリプトから現在値やオプションを扱う API を追加しました。
obj.getvalue(対象):obj.xやobj.track0等の現在値を取得します。obj.setoption(名前, 値)/obj.getoption(名前):オプションを設定・取得
します。未対応の項目も受理してスクリプトを停止させません。obj.pixeloption(名前, 値):ピクセル操作のオプションを状態として保持します。
セキュリティ / 安全性
obj.load("image" / "movie")は、ファイルの先頭ヘッダー(マジックバイト)を
検証し、真正なメディアと確認できたファイルのみを読み込みます。対応形式は
画像が PNG / JPEG / GIF / BMP / TIFF / WebP、動画が MP4 / MOV / MKV / WebM /
AVI / FLV / ASF です。- スクリプトへ生のファイルアクセス(
require/io/dofile)は引き続き
公開せず、サンドボックスを維持したままメディア読み込みを実現しました。
内部実装の最適化(リファクタリング)
新機能を両エンジンで対称に提供するため、設計の一貫性を重視した実装を行いました。
- 描画・メディア生成パイプライン
- 描画合成は専用の蓄積描画ターゲットで処理し、複数回の
obj.drawを破綻なく
重ね合わせます。 - テキスト・画像・動画はスレッド非依存の CPU 生成(DirectWrite / WIC /
Media Foundation)で実体化し、既存の図形即時反映パスへ合流させることで、
obj.load直後のピクセル参照を両エンジンで成立させました。
- 描画合成は専用の蓄積描画ターゲットで処理し、複数回の
- ネイティブ通信プロトコルの拡張
- 高速ランタイムからホストへの描画・読み込みコールバックを拡充し、図形・
テキスト・画像・動画の生成と描画合成をネイティブ環境でも同一仕様で動作
させました。
- 高速ランタイムからホストへの描画・読み込みコールバックを拡充し、図形・
- ドキュメントの同期
- 日本語・英語・簡体字中国語・繁体字中国語・韓国語・スペイン語・インドネシア
語・アラビア語の全 8 言語について、新 API・対応状況・制限事項を実装に合わせて
更新しました。
- 日本語・英語・簡体字中国語・繁体字中国語・韓国語・スペイン語・インドネシア
v1.7.1
v1.7.1 - Lua スクリプト for YMM4
内部アーキテクチャの大幅なリファクタリングと、ネイティブ環境(LuaJIT)における
描画・映像エフェクトAPI(obj.load および obj.effect)の対応を行ったリリースです。
新機能・機能改善
1. ネイティブ環境での obj.load および obj.effect 対応
v1.7.0 では MoonSharp エンジンのみの対応であった図形生成(obj.load)および
YMM4映像エフェクト連鎖適用(obj.effect)が、ネイティブ(LuaJIT)環境でも完全に
利用可能になりました。
- ネイティブ環境でも高解像度(最大4K)の図形生成に対応し、メモリリークや
GC(ガベージコレクション)の負荷を排除した最高パフォーマンスで動作します。 - これにより、
obj.loadやobj.effectを使用するスクリプトが自動的に
MoonSharp にフォールバックされる制限が解除されました。
内部実装の最適化(リファクタリング)
コードベースの保守性と安全性を高めるため、多岐にわたる設計改善を実施しました。
- 責務の分離と抽出
- Direct2D に関連するピクセルバッファ管理および変換処理を専用クラスへ分離しました。
- トークン解析処理や Transform(座標・回転・拡大率等の変形パラメータ)の書き戻し処理を
共通化・抽出しました。 ScriptDirective、SceneObjectQuery、各種例外クラス群をそれぞれ個別の
ファイルへ分離し、設計の対称性と可読性を向上させました。
- アーキテクチャの堅牢化
- ネイティブ環境との通信プロトコルを拡張し、タグ領域を拡大(256バイトから4096バイト)
することで、長文の引数を扱うエフェクトにおけるデータの欠落を完全に防止しました。 - ピクセルバッファのアロケーションを最小化するキャッシュ機構を導入し、
描画フレームごとの無駄な配列確保を排除しました。
- ネイティブ環境との通信プロトコルを拡張し、タグ領域を拡大(256バイトから4096バイト)
v1.7.0
v1.7.0 - Lua スクリプト for YMM4
AviUtl のアニメーション効果スクリプト互換層に**映像エフェクトの適用(obj.effect())**を
追加したリリースです。スクリプトから YMM4 に登録された映像エフェクトを呼び出し、
図形やピクセルで生成した画像へ連鎖適用できるようになりました。
新機能
1. obj.effect() による YMM4 映像エフェクトの適用
obj.effect(エフェクト名, パラメータ名, 値, パラメータ名, 値, ...) を実装しました。
スクリプトが生成した画像に対して、YMM4 の映像エフェクトを適用します。
- エフェクト名は YMM4 の登録名または別名で指定します。
EffectFactoriesから取得できる
全映像エフェクト(標準エフェクトおよびユーザー製プラグインを含む)が対象です。 - パラメータは表示名またはプロパティ名で指定します。型に応じて設定され、Animation は
定数値、真偽値、列挙(名前または番号)、色(0xRRGGBB)、数値、文字列に対応します。 - パラメータはキー/値のペアで複数同時に指定できます。
obj.effectを複数回呼び出すと、呼んだ順に独立したエフェクトインスタンスとして
連鎖適用されます。同じエフェクトを複数回重ねて適用することもできます。- エフェクトは、スクリプトが生成した画像(図形やピクセル)または入力画像に対して、
YMM4 本体と同じSetInput→Update→Outputのチェーンで適用されます。 - パラメータはフレームごとに再評価されるため、
obj.timeなどに応じて値を計算すれば
エフェクトのパラメータをアニメーションさせられます。
注意事項
obj.effect(およびobj.load)は描画系 API のため MoonSharp エンジンで実行されます。
ネイティブ(LuaJIT)経路ではエフェクトは適用されません。- エフェクトの登録名はローカライズされるため、指定名は実行環境の表示言語に依存する
場合があります。言語に依存させたくない場合は、英語の別名やプロパティ名を用いて
ください。 - Animation パラメータは定数値として設定されます。キーフレーム曲線は指定できません。
時間変化させたい場合はスクリプト側で値を計算してください。 - 指定したエフェクトが見つからない、または生成・更新に失敗した場合、その要求は安全に
スキップされ、画像はそのまま通過します。描画は停止しません。 - 対象エフェクトの解決は導入状況に依存します。ユーザー製エフェクトは未導入の場合、
名前が解決されずスキップされます。
内部実装
- スクリプトの
obj.effect呼び出しを実行コンテキストに記録し、スクリプト実行後に
描画スレッドで Direct2D エフェクトチェーンとして適用する仕組みを追加しました。 EffectFactories.VideoEffectFactoriesを登録名・別名で索引し、リフレクションで
対象プロパティを解決してパラメータを設定します。- YMM4 の API 変更に対する多層フォールバックを実装しました。レジストリ構築、
パラメータ解決、各エフェクトの生成・更新・適用をそれぞれ例外隔離し、失敗時は
当該エフェクトをスキップして元画像を通過させます(描画自体は停止しません)。
v1.6.0
v1.6.0 - Lua スクリプト for YMM4
AviUtl のアニメーション効果スクリプト互換層に動的パラメータの UI 反映を
追加したリリースです。スクリプトのヘッダに記述した --track / --check /
--color の宣言が、エディタのパラメータUIへ自動的に反映されるようになりました。
新機能
1. AviUtl ヘッダ宣言に応じた動的パラメータUI
スクリプト先頭の --track0〜--track3 / --check0〜--check3 / --color を
解析し、宣言された項目だけをエディタUIへ表示します。AviUtl の仕様に準じ、
トラックバーは最大4個、チェックボックスは最大4個、カラーは1個です。
--track番号:名前,最小,最大,初期値,移動量: 宣言されたトラックのスライダーを
表示します。トラック値は評価時にヘッダの最小〜最大へクランプされ、obj.track0〜
obj.track3から参照できます。--check番号:名前,初期値: トグルスライダーを表示します。値はobj.check0〜
obj.check3から真偽値(false / true)として参照できます。--color:色: カラーピッカーを表示します。選択した色はグローバル変数color
(0xRRGGBB)として参照できます。- 宣言が一つも無い場合は、従来どおり Track0〜Track3 の4スライダー表示へ戻ります。
- 各項目のラベルは多言語化された固定スロット(Track0〜3 / Check0〜3 / Color)で
表示されます。設定した値はプロジェクトファイルに保存され、再現できます。
注意事項
- ラベルは固定スロット番号で表示され、スクリプト内に記述したパラメータ名
(例:--track0:X速度,...の「X速度」)は UI ラベルへは反映されません。 - トラックのスライダー操作範囲は従来どおり -100〜100 で、ヘッダの範囲・既定値は
スライダーの表示そのものには反映されません。トラック値は評価時にヘッダの
最小〜最大へクランプされます。新規に宣言されたチェック・色にはヘッダの既定値が
適用されますが、トラックには適用されず初期値は 0 のままです。 --dialog(/chk・/col・/fig)、--file、--fontには対応していません。- 本変更に伴い、
--check/--colorの擬似展開(従来obj.checkNやcolorを
スクリプト先頭へ自動挿入していた挙動)は廃止され、値は UI から供給されます。
--dialog/--paramの展開は従来どおりです。
内部実装
- AviUtl ヘッダ(
--track/--check/--color)を解析するレイアウト解析を
追加しました。走査範囲は既存の互換変換と同じく最初の@セクションより前です。 - 解析結果に基づき、
[ShowPropertyEditorWhen]による項目ごとの動的表示と、
評価時のトラック値クランプを実装しました。 obj.check0〜obj.check3(真偽値)とグローバルcolorを、MoonSharp および
ネイティブ(LuaJIT)双方の実行経路へ配線しました。- 互換変換から
--check/--colorの擬似展開を廃止し、UI を値の唯一のソースに
しました。 - チェック・色のラベルを多言語リソースへ追加しました。
- ヘッダ解析および互換変換の挙動変更に関するユニットテストを追加・更新しました。
v1.5.0
v1.5.0 - Lua スクリプト for YMM4
AviUtl のアニメーション効果スクリプト互換層に**図形描画(obj.load("figure"))**を
追加したリリースです。スクリプトから円・四角形・三角形などの図形を生成し、
オブジェクトの画像として描画できるようになりました。
新機能
1. obj.load("figure") による図形描画
obj.load("figure", 名前, 色, サイズ [, ライン [, アスペクト]]) を実装しました。
指定した図形を生成してオブジェクトのバッファを置き換え、図形そのものを描画します。
- 対応図形: 円・四角形・三角形・五角形・六角形・星形(英語名 circle / rect /
triangle / pentagon / hexagon / star も使用可) - 塗りつぶしとライン(中抜き)に対応します。
ラインを省略するか 0 を指定すると
塗りつぶし、サイズ以上の値を指定した場合も塗りつぶしになります。 アスペクト(-1.0〜1.0)で幅・高さを歪曲できます。正で横幅、負で縦幅が縮みます。- 図形は SDF ベースのアンチエイリアスで描画されます。出力は図形サイズに合わせて
生成され、オブジェクトの中心に配置されます。
描画系 API(obj.load / obj.draw / obj.effect / obj.setoption /
obj.copybuffer)を含むスクリプトは、図形バッファモデルを持つ従来エンジン
(MoonSharp)へ自動的に振り分けられます。
注意事項
- 本リリースで実装されているのは
obj.load("figure", ...)のみです。画像ファイルや
"text"・"tempbuffer"・"movie" などの読み込み、obj.draw/obj.drawpolyによる
合成、obj.effect/obj.setoption/obj.copybuffer/obj.setfontには
対応していません。これらを呼び出すスクリプトは意図どおりには動作しません。 - 図形のサイズに
obj.track0等を用いる場合、Track0〜Track3 のスライダー範囲は
-100〜100 で、AviUtl ヘッダの範囲・既定値は UI へ反映されません。より大きな図形が
必要な場合は数値欄へ直接入力するか、サイズを直接記述してください。
内部実装
- SDF(符号付き距離場)による1パス・アンチエイリアスの図形ラスタライザを追加し、
プリマルチプライド BGRA バッファを生成します。 - スクリプト実行コンテキストにバッファ置換 API を追加し、
obj.loadが入力画像を
図形バッファへ差し替えられるようにしました。出力経路は置換後のサイズで生成し、
図形を原点中心に配置します。 - 図形ごとの被覆・色・サイズのユニットテスト、および描画系スクリプトのエンジン
振り分けテストを追加しました。
v1.4.0
v1.4.0 - Lua スクリプト for YMM4
AviUtl のアニメーション効果スクリプト(.anm 系)に対する部分互換層を追加した
リリースです。座標・拡縮・回転・不透明度の変形と乱数を用いる範囲について、追加の
記述変更なしで AviUtl 向けスクリプトを実行できるようになりました。
新機能
1. AviUtl スクリプトの部分互換
AviUtl のアニメーション効果スクリプトのうち、本プラグインの変形・ピクセルモデルへ
無理なく写像できる範囲を実行できる互換層を追加しました。スクリプトに AviUtl 固有の
記法が含まれない場合、この互換層は一切介入しないため、従来のスクリプトの挙動は
変わりません。
- スクリプトヘッダの解釈: コメント形式のパラメータ宣言を解釈し、スクリプト本体が
参照する変数を実行前に定義します。これまでは単なるコメントとして無視され、参照変数が
nilになり実行できなかったスクリプトが動作するようになります。--dialog:項目名,local 変数=既定値;…… 各項目の宣言部を本体の先頭へ展開します。--color:0xRRGGBB… 変数colorを指定色で定義します。--check0:項目名,既定値…obj.check0(0〜3)を既定値で定義します。--param:任意のLua文… 記述した Lua 文をそのまま本体の先頭へ展開します。--track0:〜--track3:… 値は従来どおりobj.track0〜obj.track3から参照します
(ラベル・範囲・既定値の UI 反映は行いません)。
@による複数セクション: 1 つのスクリプトに@名前で複数の効果が定義されて
いる場合、先頭のセクションのみを実行します。
2. obj.rand の追加
AviUtl 互換の決定論的な整数乱数 obj.rand(st, ed [, seed [, frame]]) を追加しました。
指定範囲 st〜ed の整数を返し、seed と frame が同じであれば常に同じ値を返します。
frame を省略すると現在のフレームを用います。従来エンジン(MoonSharp)と高速ランタイム
(LuaJIT)で同じ値を返すため、エンジンの自動振り分けによらず結果が一致します。
注意事項
- 描画・フィルタ・ファイルアクセス系の関数(
obj.load/obj.draw/obj.drawpoly/
obj.effect/obj.copybuffer/obj.setoption/obj.setfont、require、io等)は
本体の描画パイプラインへの統合を要するため、この互換層では対象外です。これらを呼び出す
スクリプトは意図どおりには動作しません。 --track0:〜--track3:のラベル・範囲・既定値はエフェクトパネルの UI へ反映されません。
トラックバーの値は従来どおり Track0〜Track3 のスライダー値が使用されます。- エンジンに依存しない小数の乱数が必要な場合は、従来どおり
anim.randを使用してください。
内部実装
- スクリプトを実行可能な Lua へ変換する前処理を追加し、MoonSharp・LuaJIT の両実行系へ
一貫して適用しました。変換結果はソース単位でキャッシュし、毎フレームの再解析を避けています。 obj.randの数値コアを C# と LuaJIT で同一アルゴリズムとして実装し、両者がビット単位で
一致することを等価性テストで検証しています。- AviUtl 固有の記法を含まないスクリプトでは前処理がソースをそのまま返すため、既存スクリプト
および既存の実行・キャッシュ経路に対する影響はありません。
v1.3.4
v1.3.4 - Lua スクリプト for YMM4
ネイティブ実行中の obj.getobject を高速化したリリースです。
同じオブジェクトを繰り返し参照するスクリプトで、本体プロセスへの問い合わせ回数を
削減し、大幅に高速化しました。
改善
1. 同一オブジェクト参照のキャッシュによる高速化
ネイティブ実行中の obj.getobject は、解決に必要なシーン情報が本体プロセス側にしか
存在しないため、呼び出しごとに本体プロセスへの問い合わせ(往復)を伴います。この往復は
1 回あたりのコストが大きく、同じオブジェクトをループ内で繰り返し参照すると無視できない
負荷になっていました。
本リリースでは、同じタグ・同じフレームへの連続した問い合わせをフレーム内でキャッシュ
するようにしました。2 回目以降は本体への往復を行わずにキャッシュした結果を返すため、
同一オブジェクトを繰り返し参照するスクリプトでは問い合わせ回数が 1 回に削減されます。
内部計測では、該当パターンが 1000 倍以上高速化することを確認しています。返り値は従来
どおり呼び出しごとに新しいテーブルであり、出力結果は変わりません。
注意事項
- キャッシュが効くのは、同じタグ・同じフレームへの連続した問い合わせです。毎回異なる
オブジェクトやフレームを参照する場合は、その都度本体プロセスへの往復が発生します。
この場合は結果を変数へ保持して呼び出し回数を抑えることを推奨します。
内部実装
- ワーカー側に直前の問い合わせ結果のキャッシュを設け、同一タグ・同一フレームへの連続
呼び出しでは本体への往復を省きます。キャッシュは各フレームの実行開始時に破棄されるため、
フレームをまたいで古い結果が再利用されることはありません。 - 本体側ではタグ文字列の確保を使い回し、問い合わせごとのアロケーションを抑えることで、
長時間の出力における GC 負荷を軽減しました。