最近準備在手機專案客戶端中使用lua, 以前一直在伺服器使用luabind. 另外, tolua++也體驗過, luaplus也在早年用過. 以下是本人對這些繫結庫的個人感覺:
luabind
利用boost機制把繫結做到極致, 比較適合主c++, 弱lua的指令碼框架.
作者已經停止更新, 在windows/linux編譯沒問題, 但是在ios的llvm下, 無法編譯
tolua++
像cocos2dx使用tolua++也是可以理解的, 那麼多函式需要繫結, tolua++的標頭檔案parse及自動**生成節約了很多手動繫結的時間.
但是看到**中有一部分bugfix就心存不安(純個人感覺, 本人使用不多, 歡迎磚頭伺候),另外, tolua++只能由指令碼層驅動c++, 而沒有將已經例項化的控制代碼註冊到lua的功能也是煞筆啊
luaplus
介面較為簡單, 適於初學者上手, 無任何的模板, 效能不高
手冊:
純標頭檔案實現, 無需編譯, 包含進入工程即可, 介面簡潔高效
相比luabind, 唯一不能實現的常用功能就是列舉, 但是可以支援類成員靜態變數註冊, 這個就無所謂了, 手寫乙個列舉支援也很簡單
看下演示**:
class a
virtual void foo( int a )
std::string member;
};class b : public a
};void foo( int b )
luabridge::getglobalnamespace(l)
.beginclass("sobj")
.addconstructor<
void (*) (void)> ()
.addfunction("foo", &a::foo)
.adddata("member",&a::member)
.endclass()
.deriveclass("ssec")
.addfunction("foo",&b::foo )
.endclass();
luabridge::getglobalnamespace(l).addfunction("foo", foo );
b ins;
ins.member =
"data";
luabridge::setglobal(l, ins, "ins");
lua側的**
local a = sobj()
a:foo(2)
a.member =
"hello"
ins:foo(3)
應用在cocos2dx中的部分測試部分:
下面是乙個用於測試的類
class testa
int getvalue()
};下面是繫結**
luabridge::getglobalnamespace(pengine->getluastack()->getluastate())
.beginclass("testa")
.addconstructor<
void(*) ()>()
.addfunction("getvalue", &testa::getvalue)
.endclass();
然後,就可以在你的lua**使用這個類了。
local testa = testa ()
cclog("testa=%d", testa:getvalue())
現在cocos2dx上面,現在出現了兩個重要的lua分支, 乙個是quickx,乙個cocos-code
-ide。
使用LUA 熱更新模組
最近準備在手機專案客戶端中使用lua,以前一直在伺服器使用luabind.另外,tolua 也體驗過,luaplus也在早年用過.以下是本人對這些繫結庫的個人感覺 luabind 利用boost機制把繫結做到極致,比較適合主c 弱lua的指令碼框架.作者已經停止更新,在windows linux編譯...
lua 熱更新原理 一
熱更一般是針對模組的線上替換。我們動態載入要熱更的模組試試。例如,我們在迴圈間隔載入某模組,這樣就能有時間去更改模組了。測試的 如下 for i 1,5 do local m require other print other.a is m.a sleep 5 end我們迴圈載入了other這個模組...
Lua熱更新原理及示例
網上有不少lua熱更新的文章,都只說了理論,被沒有給出實際可操作的 下面是我寫的幾個例子。lua的require modelname 把乙個lua檔案載入存放到package.loaded modelname 當我們載入乙個模組的時候,會先判斷是否在package.loaded中已存在,若存在則返回...