まとめ
- Lua ファイルを複数ファイルに分ける方法について,まともな日本語情報がなかったのでまとめた
- 同名関数を呼び分ける方法についてもまとめた
Lua ファイルを複数に分け,同名関数を呼び分ける
Lua ファイルを複数に分割したいのだが,
検索しても意外とヒットしない.
前回の記事で書いた方法で実現できるのだが,
パフォーマンスに難があったため再度調査.
luaL_loadbuffer();
を呼ぶと,内部でコンパイルが行われるらしく,遅い.
しかし,
このコンパイルされた結果は,
スタックの一番上に積まれるため,
それを保存しておいて,
再利用することで再コンパイルを回避できる.
参考.
つまり,
// key のグローバル変数を取得
lua_getglobal( LuaManager::GetLuaState(), key );
// 存在する場合は一番上が function になる.
// なければ新規にロードする.
if( lua_type( LuaManager::GetLuaState(), 1 ) != LUA_TFUNCTION )
{
int ret = luaL_loadbuffer( LuaManager::GetLuaState(), buf, size, key );
// key の名前でグローバル変数に登録
lua_setglobal( LuaManager::GetLuaState(), key );
// どうせ再度 get するのでポップしてしまう
lua_pop( LuaManager::GetLuaState(), 1 );
}
else
{
// どうせ再度 get するのでポップしてしまう
lua_pop( LuaManager::GetLuaState(), 1 );
}
// key のグローバル変数を取得
lua_getglobal( LuaManager::GetLuaState(), key );
// 一度 call する必要がある.
lua_pcall(LuaManager::GetLuaState(), 0, 0, 0);
とすることで,
Lua のグローバル変数にコンパイルされた結果(チャンク)
を保持しておける.
key はファイル名になっているので,
同じファイルの内容が再度コンパイルされることはない.
同名関数の呼び分けも上記で実現できている.
key という名前で保存しているグローバル変数の中身は
コンパイル済みのチャンクなので,
lua_getglobal してやればスタックの最上位に取得できる.
この状態で
luabind::call_function<void>(LuaManager::GetLuaState(), "Update", this);
のようにしてやれば良い.
ただし,上記のままだと
リロードが潰れてしまうので,
そこだけ少し工夫してやる必要がある.
以上.