Unity项目常见Lua解决方案性能比较

简介:

测试说明

Unity不支持热更新这事情一直是谜一样的痛点,特别是在作者第一个项目上线之后,发现每次更新代价实在太大,可惜官方Roadmap上迟迟没有出现这个功能。

UWA之前分享过 Android平台热更新解决方案,直接替换dll是一种解决方式(但iOS上因为使用IL2CPP故而无法实现,而且这事本质上为商业原因而非技术问题)。除此之外还有一个比较常见的解决方案,就是用Lua。考虑到笔者有不少同事之前写的是Cocos2d-lua,而且也有对应后端框架如Skynet,因此立下项的时候笔者考虑使用Unity+lua的方式来开发。


测试内容

测试结果中包含了以下三种解决方案的比较:

slua, commit #ef57252
ulua, commit #dbe98bc (作者已不再维护,转至tolua)
tolua, commit #710dedc

注1:当然还存在其他解决方案如CsTolua,作者精力有限无法一一测试,欢迎Pull Request。将 slua,tolua 版本升级到最新(ulua原本就是最新)。

注2:为了不引起无谓的争端,强调下本测试只考虑解决方案本身性能差异,至于有人说 “ulua在ios下面用的是lua原生vm,跟slua用的luajit有啥好比的?”,笔者只能说如果他愿意提供luajit版本的话,笔者很乐意从使用者角度再进行测试。

注3:benchmark中的数据是笔者测试下来的真实结果,仅供参考;而且slua/ulua在OSX编辑器下有几个结果比较诡异,如有知道其原因的朋友还望能不吝告知。

注4:笔者是以slua的Test Case为范本,具体代码请参考slua Perf文件
https://github.com/qiankanglai/unity_lua_benchmark/blob/master/slua-master/Assets/Slua/Resources/perf.txt
然后在其他两个项目中复制了一遍;每个测试都统计了lua的os.clock()时间差、C#的Profiler.BeginSample()和Profiler.EndSample()。


测试环境

1) UWA在原作的基础上,对最新的Lua版本用更多机型(iPhone 4s、iPhone 5s)进行了测试作为补充,同时对原部分数据进行了修正。所使用的测试代码和原作一样,依然是6个测试用例。测试方法也相同,每个测试顺序执行五次,然后重启。

2) 目前UWA只测试了目前使用最广泛的移动平台(Android和iOS)。


测试代码

Test1

function test1()
    local transform = cube.transform
    local start = os.clock()
    for i=1,200000 do
        transform.position=transform.position
    end
    print("test1/lua " .. ((os.clock() - start) * 1000));
end

Test2

function test2()
    local transform=cube.transform
    local start = os.clock()
    for i=1,200000 do
        transform:Rotate(Vector3.up, 90)
    end
    print("test2/lua " .. ((os.clock() - start) * 1000));
end

Test3

function test3()
    local start = os.clock()
    for i=1,2000000 do 
        local v = Vector3(i,i,i)
        Vector3.Normalize(v)
    end
    print("test3/lua " .. ((os.clock() - start) * 1000));
end

Test4

function test4()
    local t = cube.transform
    local v = Vector3.one
    local start = os.clock()
    for i=1,200000 do
        local v = GameObject()  
    end
    print("test4/lua " .. ((os.clock() - start) * 1000));
end

Test5

function test5()
    local v = cube.transform.position
    local start = os.clock()
    for i=1,20000 do
        local v = GameObject()
        v:AddComponent(SkinnedMeshRenderer)
        local c=v:GetComponent(SkinnedMeshRenderer)
        c.shadowCastingMode=0
        c.receiveShadows=false
    end
    print("test5/lua " .. ((os.clock() - start) * 1000));
end

Test6

function test6()
    local transform=cube.transform
    local start = os.clock()
    for i=1,200000 do
        local t=Quaternion.Euler(100,100,100)
        local q=Quaternion.Slerp(Quaternion.identity,t,0.5)
    end
    print("test6/lua jit  " .. ((os.clock() - start) * 1000));
end

Android 平台测试结果

以下为UWA在 Android上对高、中、低配置的三款设备进行测试后得到的平均数据,图中下方的表格部分为柱状图的准确数值,而其数值表示的是完成测试用例所需的时间,单位为毫秒。

1)低端设备:三星 S3(Android OS 4.3)
请输入图片描述
注:红色部分的数值已远超其他的测试数据,因此UWA进行了截断显示,具体数值可见下方的表格。

2)中端设备:红米 Note2(Android OS 5.0.2)
请输入图片描述

3)高端设备:三星S6(Android OS 6.0.1)
请输入图片描述


iOS 平台测试结果

以下为UWA在 iOS上对armv7和arm64的两款设备进行测试后得到的平均数据,测试中使用了il2cpp+Universal的发布方式,同时禁用了bitcode。图中下方的表格部分为柱状图的准确数值,而其数值表示的是完成测试用例所需的时间,单位为毫秒。

1)armv7设备:iPhone 4s (OS 7.1.2)
请输入图片描述

2)arm64设备:iPhone 5s(OS 9.3.5)
请输入图片描述


总结

1)在Android设备上,slua在Test 2和3上较为占优,而这两个测试用例主要是大量的向量操作。而tolua在Test 1,4和5上较为占优,这三个测试则主要是组件属性的赋值,和GameObject的创建等操作。而ulua在中高端设备上基本介于两者之间,但在低端机上则有较为明显的性能问题;

2)在iOS设备上,tolua的性能表现最好、ulua次之,slua较之tolua和ulua稍高。其中,Test3中的slua的向量操作在iOS设备上较高耗时。我们暂时无法给出原因,但我们在多款iOS设备上进行了测试,均得到相似的结论。因此,值得研发团队注意。





原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
XML 编解码 编译器
Unity跨平台UI解决方案:可能是最全的FairyGUI系列教程-第八天
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1483 0
|
4月前
|
存储 自然语言处理 监控
【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的Unity官方插件:Localization 。 这个插件方便进行游戏的多语言本地化,让游戏支持多种语言,下面就来看看该插件的使用方法吧!
|
7月前
|
编解码 开发工具 图形学
Unity环境下RTMP推流+RTMP播放低延迟解决方案
在本文之前,我们发布了Unity环境下的RTMP推流(Windows平台+Android平台)和RTMP|RTSP拉流(Windows平台+Android平台+iOS平台)低延迟的解决方案,今天做个整体汇总,权当抛砖引玉。
441 0
|
Windows
在VsCode上调试Cocos2d-x lua项目
在VsCode上调试Cocos2d-x lua项目
749 0
|
10月前
|
人工智能 算法 安全
开源游戏区块链项目分享:Unity开发的独立区块链
开源游戏区块链项目分享:Unity开发的独立区块 2023年了,区块链在这此时代热浪下都已经是即将燃尽的火苗了,而ChatGPT、Stable Diffusion等AI产品已经成为当下风口和热浪。然而区块链作为上一任浪热下的余晖,真的就这么完事了么?其实目前区块链在国内更多作为信用链存在,用于法律签约、物流运输、商务合作、加密合约等等公共底层方面。 而此文将不仅探讨区块链的其他实际用途,同时也开源了一个Unity3D C#编写的区块链代码,如果你是技术人员,刚好你做区块链项目,希望这个文章和代码能帮助到你。
532 0
|
11月前
|
图形学
Unity Lua热修复框架图
Unity Lua热修复框架图
68 0
|
JSON NoSQL Redis
redisTemplate redis lua,attempt to compare two nil values, java.lang.IllegalStateException 解决方案,亲测可用
redisTemplate redis lua,attempt to compare two nil values, java.lang.IllegalStateException 解决方案,亲测可用
redisTemplate redis lua,attempt to compare two nil values, java.lang.IllegalStateException 解决方案,亲测可用
|
存储 监控 NoSQL
【已解决】Java 项目中利用 Redis 配合 Lua 脚本对短信推送消息做推送限制
【已解决】Java 项目中利用 Redis 配合 Lua 脚本对短信推送消息做推送限制
230 0
|
图形学
Unity热更新——lua语言
Unity热更新——lua语言
96 0
|
机器人 图形学 Ruby
【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏中动画制作(4-1)
【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏中动画制作(4-1)
202 0
【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏中动画制作(4-1)