您的位置:首页 > 移动开发 > Unity3D

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

2015-08-07 16:29 591 查看


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

欢迎来到你的代码我的鱼,oooofish.com,本篇文章主要介绍Unity中可用的lua版本对比及分析。

目前常见的unity lua库有以下:luainterface、ulua、nlua、unilua


简单介绍

luainterface: C#的lua桥接库作者Craig Presti

项目位置:https://code.google.com/p/luainterface/,(windows平台例程:http://code.google.com/p/luaforwindows/),uLua和NLua都是基于此库升级编写,作者于2013年4月30日停止更新,并推荐大家关注luainterface的一个分支Nlua。

Windows C#程序集成方法:见windows平台例程

Unity集成方法:见插件https://www.assetstore.unity3d.com/en/#!/content/391 for
free(仅支持Windows)支持移动设备的版本见其2个分支

Nlua(http://nlua.org/开源Free)

ulua(https://www.assetstore.unity3d.com/en/#!/content/13887闭源$40)

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

但是,万万有个但是,详见下篇。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: