XLuaの基礎5

  • array.dll について

外部 DLL 形式で提供される XLua 用の拡張 Cモジュールの一つ。スクリプト中で「 require 」して用いる。特徴としてこれを用いて確保した変数は Lua のガベージコレクションの影響を受けない、かつ C言語風 ? に多次元配列を扱うことができる。中〜上級者向け。初歩的な C言語などの知識が要求される。

Lua は通常の方法で変数を作ると自動的に「 double 型」で作られます。これが array.dll を用いると変数に特定の「型」を指定できるようになります。簡単に言うと「 double 型」で「 1という値」を 1000000 個の変数で扱う場合と比較したら、「 byte 型」を指定して 1000000 個変数を持つようにした方がメモリ使用量は圧倒的に少なくて済みます。しかし「 byte 型」は -128 〜 127 までの値しか扱えません。言い換えると「 byte 型」を指定したら扱える数値に極端な制限を受けるけど、メモリ使用量は抑えることができるって具合に「自由度」と「サイズ」のトレードオフとなります。

  • 実際どうなの?

先に述べたとおり、array.dll 経由だとスクリプト言語ならではの格納データ型を気にする必要が無いという自由度を奪われる代わりに「メモリリソースの管理」と「ガベージコレクション回避」という二つの特典が付きます。変数定義の仕方が Lua の標準と比べたら異なるので、C言語に慣れた人向きの拡張モジュールなのかなとは思います。しかし実験すると確かに省メモリで実行できるようなので、膨大な計算を変数使ってこなす場合には強い味方?・・・やっぱり分かりません。ブログ筆者は面白がって普段から使っているだけなので、これが実用的なのかあまり関係ないのです。多次元配列の指定はこっちのほうが楽な場合もあります。例えば Lua だと

local a = {0,0,0,0,0,0,0,0,0,0}
という書き方をするけどこれが array.dll を用いれば
local a = array.new(1,10,”double”)
あるいは
local a = array.new(1,10,”byte”)
となります。じゃあまた Lua に戻って
local a = {{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0}}
となるところをarray.dllなら
local a = array.new(2,10,”double”)
・・・・・array.dllの方が簡潔で分かりやすい(間違えにくい)ですね。じゃあ【 Lua 】
local a = {{0,0,0},{0,0,0}},{{0,0,0},{0,0,0}}
これは array.dll でどう書くか。
local a = array.new(2,2,3,”double”)
ですね。指定する際に間違えにくいというのは大事なんじゃないかと思います。

変数 a の Dimensions は Lua だと
print(#a)
で確認できますがarray.dllを使うと
print(a:dimensions())
でも確認できます。

じゃあ array.dll を使って
local a = array.new(100)
と書いたらどうなるかというと
a:dimensions() == 1 です。そして型指定を省いたのでこの場合自動で「 double 型」で作成されました。「 byte 」で作りたいのなら、array.new( 100, “byte” )と書きます。この確認をしたい場合は
local a=array.new(100,”byte”)
print(assert(a:dimSize(1)==100))
で結果は「 True 」が返ってくる。試しに
type(a)
でタイプを調べると Lua は「userdata」と返します。
しかしこれだと値は代入されていないので
print(a:at(1))
と書いても結果は「 0 」が返ってきます。変数 a に値を代入したい場合は
local a=array.new(100,”byte”)
a:set(1,100)
print(assert(a:dimensions()==1), a:at(1))
これで「true, 100」と返ってきます。

手続きがめんどくさいと思ったら即使わない外部 Dll です。XLua を使う上で必須でもありません。省メモリについてはサンプルファイルをつけておきます。MMF のデバッガから見るとメモリ使用は確かに減ってるけど、array.dll を使うと変数への値代入はタイムコストが約 3 倍に跳ね上がるようです。この分析が正しいとしたら使うタイミングと要所は押さえる必要があります。

array.dll_sample.zip

array.dll を用いたサンプル


>>次のページへ