BETA

AviUtl拡張編集のLuaの変数の生存期間を調べてみる

投稿日:2018-11-02
最終更新:2018-11-02

お題の通り。

Luaには、変数が生成されている場合に自分自身を、 生成されていない場合に初期値を代入できる便利な仕組みがあります。

  hoge = hoge or 0

これをAviUtlの拡張編集スクリプト内で使用した場合に、どのような動作になるのか検証してみます。

先に結論

local 大事!ちゃんとつけよう!

  • ローカル変数はスクリプト実行の度に生成・破棄される
  • グローバル変数はスクリプト実行後も残り、また、全てのオブジェクトや効果で共有となる (※つまりスクリプト間での競合が発生しうる)

検証に使うスクリプト

  @ローカル変数
  --track0:サイズ,1,200,100,1
  local lcounter = lcounter or 0
  lcounter = lcounter + 1
  obj.setfont("メイリオ", obj.track0, 0, 0xffffff, 0xffffff)
  obj.load("text", "lcounter: " .. tostring(lcounter))

  @グローバル変数
  --track0:サイズ,1,200,100,1
  gcounter = gcounter or 0
  gcounter = gcounter + 1
  obj.setfont("メイリオ", obj.track0, 0, 0xffffff, 0xffffff)
  obj.load("text", "gcounter: " .. tostring(gcounter))

これをカスタムオブジェクトとして挿入してみます。

ローカル変数と、グローバル変数、両方試してみます。

ローカル変数

まずは結論が単純なローカル変数のほうから。

こちらは、いくらオブジェクトを読み込んでも、変数の内容はずっと1でした。 スクリプト実行後に変数が破棄されていることがわかります。

グローバル変数

こちらは、オブジェクトのある場所を再生・表示する度に値が増えました。

各フレームでスクリプトを実行した後も変数が残っているようです。

で、厄介だったのはここから。

複数のオブジェクトを挿入してみる

以下のように、複数個所にオブジェクトを配置して、動作結果を見てみました。

すると…

オブジェクト間をまたいで変数が共有されていることがわかりました。
フッフウ、なんてこったい!

複数レイヤーに挿入してみる

また、以下のように複数レイヤーにオブジェクトを入れてみました。

すると…

やっぱり共有されてました。

どうやら、AviUtlが終了しない限りは残り続けるようですね。

別シーンに同じように追加しても、変数の値は共有されていました。 また、オブジェクトをすべて削除しても、変数の値が消えることはありませんでした。

別スクリプト・効果で同名の変数を使う

ここまできたら、これも検証しておくべきでしょう。

追加で以下のファイルを作りました。

  --track0:サイズ,1,200,100,1
  gcounter = gcounter or 0
  gcounter = gcounter + 1
  obj.setfont("メイリオ", obj.track0, 0, 0xdddddd, 0xdddddd)
  obj.load("text", "gcounter: " .. tostring(gcounter))

これを図形のアニメーション効果として挿入します。

その結果…

はい!!!!!!!!!!

これは、グローバル変数にうっかり「counter」とか、そういう安直な名前つけちゃうとマズそうですね。 他のスクリプトで使ってたら事故ります。
逆にこの仕様使って、複数の異なるスクリプト間で状態制御できたりするんじゃないかな??

あとがき

当初予測では、オブジェクト毎に変数を持つものだと思っていましたが、違うようでした。

厄介なのが、レイヤーやシーン、オブジェクトをまたいでも変数が共有される点で、まーあこれはさすがにどうしたもんかなぁと。

シーン50個、レイヤー各100層の500個分の記憶域確保とかはさすがにバカバカしいからやらないにしても、 実行後も状態保存して学習していくタイプのスクリプトを組む際は、頭の片隅に入れておくべき内容かなぁと思います。

ひとまず、フレーム内で処理が完結するような変数に対しては、localつけましょう。 スクリプト終了後にちゃんと破棄してくれるので、他のスクリプトとの衝突の心配がありません。

グローバル空間の命名方法は、ちゃんと考えましょう。 ヘタすりゃ何故か動かずドツボにはまります。そんなスクリプトを書くほうがレアだと思いますが。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@bifozp'の技術ブログ

よく一緒に読まれる記事

1件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
12/05 20:38

自分もaviutlでスクリプトを利用することがあるのですが、この仕様は知りませんでした。
教えてくださって感謝です!これからはloacalちゃんとつけようと思いました。

目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!