1. 程式人生 > >Unity中可用Lua版本效率分析比較

Unity中可用Lua版本效率分析比較

歡迎來到你的程式碼我的魚,oooofish.com,本篇文章主要介紹Unity中可用的lua版本對比及分析。

目前常見的unity lua庫有以下:luainterface、ulua、nlua、unilua

簡單介紹

luainterface: C#的lua橋接庫作者Craig Presti

LuaInterface是開源的C#的lua橋接庫,配合開源庫luanet(http://luaforge.net/projects/luanet/),能輕鬆實現Lua,C#相互呼叫和引數事件傳遞。作者僅完成了windows程式的功能實現,跨平臺並沒有完成,Nlua出現後,因時間等原因作者放棄了Luainterface的更新,推薦大家使用Nlua。(作者2010年停止更新,2013年公告建議使用NLua)

Nlua是實現跨平臺的Luainterface的升級版作者 Vinicius Jarina'

專案位置:https://github.com/Mervill/Unity3D-NLua
Nlua是LuaInterface的一個分支,繼承了Luainterface的所有優點,並將Luanet庫功能整合到程式碼中,實現跨平臺(Windows, Linux, Mac, iOS , Android, Windows Phone 7 and 8),對ios平臺做了特殊處理,如支援了委託的橋接。
配合NLua有2種Lua實現,第一種是KeraLua(https://github.com/NLua/KeraLua

),基於原生Lua,將C API 進行簡單的包裝,使C# 可以方便使用 Lua C API,第二種是KopiLua(https://github.com/NLua/KopiLua),C#實現的Lua vm(對,和UniLua一樣也是純C#實現的Lua vm)。以下為關於兩種方案的比較。
使用KeraLua,必須將lua 編譯成 Unity3D Plugin,並將編譯好的檔案放到Plugins資料夾下相應的平臺資料夾中。並定義#define USE_KERALUA
使用KopiLua,定義#define USE_KERALUA即可

ulua基於luainterface升級版

專案位置:https://www.assetstore.unity3d.com/en/#!/content/13887


uLua:Lua + LuaJIT + LuaInterface,全平臺支援。在原生C的基礎上使用LuaJit(http://luajit.org/luajit.html)進行加速,如果uLua效率高,LuaJit有很大功勞,作者僅僅提供了uLua外掛包,並未提供整套外掛原始碼。此外,作者重寫了loadfile、print等api,不過這不重要,這些Api我都沒用到,也用的自己實現的。
使用非常簡單,匯入package,就可以開始編寫程式碼了,so easy。

unilua是lua5.2的C#版

專案位置:https://github.com/xebecnan/UniLua
純C#的Lua 5.2實現,是不是感覺似成相識,對的,KopiLua也是純C#實現的Lua vm,雖然Unilua出名,但是沒有KopiLua的配套庫好用,其自身同的Ffi庫,是實驗性質的庫,不完善,作者不推薦使用,雖然作者在其商業專案中使用,但是這只是其中一部分程式碼,Unilua和C#中間層的程式碼作者並沒有開源。UniLua僅僅提供了Lua原生的介面,如果要在Lua程式碼中呼叫C#,使用就需要把Luanet 移植到Unilua程式碼中,總的來說很蛋疼,據推測Unilua方法都是使用Lua標準的命名方式,所以將luanet原始碼中所有C介面全部手動改寫成Unilua 的介面,就可以使用,這個工作量,等閒的時候把玩比較好。

效率測試

簡單介紹之後,記下來的工作就是效率測試了,所有測試都是在我的魅族MX 上進行,低端機更能體現每個lua的效率
測試2個方面

Lua中例項化GameObject 並立即銷燬
for i=1,50000 do
local Go = GameObject('init')
GameObject.DestroyImmediate(go)
end

Lua呼叫C#方法
for i=1,50000 do
trans.localPosition = Vector3.zero
end

C#實現結果如下
例項化50000個gameobject 用時共2.5秒左右
設定localposition 50000次用時共0.01秒左右
ULUA結果
例項化50000個gameobject 用時共14.5秒左右
設定localposition 50000次用時共4.5秒左右
NLUA + KOPILUA結果如下
例項化50000個gameobject 用時共40秒左右
設定localposition 50000次用時共26秒左右
NLUA + KERALUA 結果如下
例項化50000個gameobject 用時共31.2秒左右
設定localposition 50000次用時共12.3秒左右
UNILUA自定義庫結果
例項化50000個gameobject 用時共3.5秒左右
設定localposition 50000次用時共0.15秒左右

以上測試程式碼中,NLUA + KOPILUANLUA + KERALUA編寫方式依然可以優化,基本可以優化到25秒和15秒以內。

從資料上來看執行速度依次排名:C# > UNILUA > ULUA > NLUA + KERALUA > NLUA + KOPILUA

從時間上來看Unilua結果很理想,但是…………其他4個庫測試我用了2小時,UniLua編寫到測試,我也用了2小時,Unilua滿滿的惡意,一直在嘗試實現,最後實現方式也與其他庫完全不一樣,更像是在C#中編寫指令,在lua中呼叫指令,這樣速度當然快,如果C版LuaInterface 也用這種方式進行編寫,預計LuaInterface會稍快,但是在計算方面,C實現的Lua 也比UniLua快。Unilua和KopiLua沒有對比測試。原生C LuaInterface 也沒有測試。uLua比NLUA + KERALUA快很多,主要歸功與LuaJit,Amazing Lua performance thanks to LuaJIT。

預計排名為:LuaInterface>Unilua = KopiLua

根據本次對比結果,得出結論推薦使用順序為:ULUA、NLUA ( KERALUA/ KOPILUA)  、LuaInterface、UNILUA

但是,萬萬有個但是,詳見下篇。