lua可以加載時必備的內容:
第一個:LuaState:必須,最好是做成單例管理,因為在使用protobuf的時候,如果不是同一個luastate加載的lua,有可能出現如下問題:
lua代碼中require時找不到對應的C庫。例如:require "pb" 找不到。因為tolua框架里有個pb.c,在做protobuf編碼和解碼的時候會調用到,如果不是同一個luastate創建的調用,則出現調不到require "pb"
第二個:LuaLoader loader = new LuaLoader();必須要,沒有為什么。
第三個:OpenLibs()
這個東西非常重要,它標志着你一些C寫的PB的內容能不能使用,比如你想去做一個LUAtable去對應protobuf協議,那么你在里面編碼解碼時,tolua的框架會去調用require "pb",如果你沒有寫這個庫的注冊,那么你將不能使用pb的庫。
這個庫里的注冊內容包括如下:
lua.OpenLibs(LuaDLL.luaopen_pb);
lua.OpenLibs(LuaDLL.luaopen_sproto_core);
lua.OpenLibs(LuaDLL.luaopen_protobuf_c);
lua.OpenLibs(LuaDLL.luaopen_lpeg);
lua.OpenLibs(LuaDLL.luaopen_bit);
lua.OpenLibs(LuaDLL.luaopen_socket_core);
第四個:lua.luasettop
網絡上的解釋是如下,具體也不用關注,不明白LUA底層的話也很難明白這個:
設置棧的高度,如果之前的棧頂比新設置的更高,那么高出來的元素會被丟棄,反之壓入nil來補足大小。
另外,Lua提供了一個宏,用來從棧中彈出n個元素:#define lua_pop(L, n) lua_settop(L, -(n)-1)
第五個:luabinder.bind(lua)
將當前luastate的虛擬機中綁定C#中的一些類、全局類、委托等等。
第六個:Register
注冊協程,你懂的,協程太重要了