lua 熱更新模組

2021-07-25 09:20:21 字數 1825 閱讀 2672

最近準備在手機專案客戶端中使用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中已存在,若存在則返回...