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
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
4月前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
106 2
|
4月前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
110 0
|
2月前
|
编译器 vr&ar 图形学
从零开始的unity3d入门教程(五)---- 基于Vuforia的AR项目
这是一篇Unity3D结合Vuforia实现增强现实(AR)项目的入门教程,涵盖了环境配置、Vuforia账户注册、Target数据集创建、Unity项目设置、AR程序配置、Android环境配置以及最终在手机上测试运行的全过程。
从零开始的unity3d入门教程(五)---- 基于Vuforia的AR项目
|
2月前
|
API 开发工具 vr&ar
PicoVR Unity SDK⭐️一、SDK下载、项目设置与程序初始配置
PicoVR Unity SDK⭐️一、SDK下载、项目设置与程序初始配置
|
2月前
|
Linux 开发工具 图形学
Unity下实现跨平台的RTMP推流|轻量级RTSP服务|RTMP播放|RTSP播放低延迟解决方案
自2018年起,我们成功实现了Unity环境下的低延迟RTSP|RTMP播放,达到毫秒级延迟,获得业界广泛认可。现已覆盖Windows、Android、iOS与Linux平台的RTMP推送、轻量级RTSP服务及RTSP|RTMP播放。通过高效采集Unity窗口或摄像头数据,并利用原生SDK进行编码与推送,确保了数据传输的高速性。此外,播放器支持多路视频同时播放,适应不同分辨率,并保持长时间运行稳定。更多技术细节和技术博文,请参考相关链接。
150 1
|
2月前
|
开发者 图形学 iOS开发
掌握Unity的跨平台部署与发布秘籍,让你的游戏作品在多个平台上大放异彩——从基础设置到高级优化,深入解析一站式游戏开发解决方案的每一个细节,带你领略高效发布流程的魅力所在
【8月更文挑战第31天】跨平台游戏开发是当今游戏产业的热点,尤其在移动设备普及的背景下更为重要。作为领先的游戏开发引擎,Unity以其卓越的跨平台支持能力脱颖而出,能够将游戏轻松部署至iOS、Android、PC、Mac、Web及游戏主机等多个平台。本文通过杂文形式探讨Unity在各平台的部署与发布策略,并提供具体实例,涵盖项目设置、性能优化、打包流程及发布前准备等关键环节,助力开发者充分利用Unity的强大功能,实现多平台游戏开发。
62 0
|
4月前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
175 2
|
4月前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
50 1
|
4月前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
67 0
|
4月前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
78 0