C++ Lua ゲーム開発

【luabind】複数ファイルの同名関数を呼び分ける

まとめ

  • Lua ファイルを複数ファイルに分ける方法について,まともな日本語情報がなかったのでまとめた
  • 同名関数を呼び分ける方法についてもまとめた

 

Lua ファイルを複数に分け,同名関数を呼び分ける

Lua ファイルを複数に分割したいのだが,
検索しても意外とヒットしない.

前回の記事で書いた方法で実現できるのだが,
パフォーマンスに難があったため再度調査.

luaL_loadbuffer();

を呼ぶと,内部でコンパイルが行われるらしく,遅い.

しかし,
このコンパイルされた結果は,
スタックの一番上に積まれるため,
それを保存しておいて,
再利用することで再コンパイルを回避できる.

参考.

stackoverflow.com

つまり,

// 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);

のようにしてやれば良い.

ただし,上記のままだと
リロードが潰れてしまうので,
そこだけ少し工夫してやる必要がある.

以上.

  • この記事を書いた人

GOTH

鹿児島県出身,吉祥寺在住の27歳.職業はゲーム会社でプログラマー.趣味はバイク,車,キャンプ,ガジェット,読書,そしてゲーム開発. サイトのテーマはプログラミングとガジェットでライフハック.たまに趣味に関する雑感や記録を残していく備忘録.ツイッターもやってます.
自己紹介
お問い合わせ

-C++, Lua, ゲーム開発