找回密码
 立即注册
查看: 145|回复: 0

Unity项目常见Lua解决方案性能斗劲

[复制链接]
发表于 2024-7-15 17:41 | 显示全部楼层 |阅读模式
在此首先感激作者钱康来供稿。此文之前UWA在公众号(uwatech)上曾推送过,但鉴于当时测试的Lua版本并非最新,因此UWA在第一时间将其删除。此刻,UWA和原作者一起将Lua版本进行更新,并结合原作的思路框架从头进行测试,总结成此文,但愿对正在或将要使用Lua的伴侣有所借鉴。当然,如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群465082844)
作者博客:http://qiankanglai.me
知乎专栏:https://zhuanlan.zhihu.com/soulgame
测试说明

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
  1. function test1()
  2.     local transform = cube.transform
  3.     local start = os.clock()
  4.     for i=1,200000 do
  5.         transform.position=transform.position
  6.     end
  7.     print(”test1/lua ” .. ((os.clock() - start) * 1000));
  8. end
复制代码
Test2
  1. function test2()
  2.     local transform=cube.transform
  3.     local start = os.clock()
  4.     for i=1,200000 do
  5.         transform:Rotate(Vector3.up, 90)
  6.     end
  7.     print(”test2/lua ” .. ((os.clock() - start) * 1000));
  8. end
复制代码
Test3
  1. function test3()
  2.     local start = os.clock()
  3.     for i=1,2000000 do
  4.         local v = Vector3(i,i,i)
  5.         Vector3.Normalize(v)
  6.     end
  7.     print(”test3/lua ” .. ((os.clock() - start) * 1000));
  8. end
复制代码
Test4
  1. function test4()
  2.     local t = cube.transform
  3.     local v = Vector3.one
  4.     local start = os.clock()
  5.     for i=1,200000 do
  6.         local v = GameObject()  
  7.     end
  8.     print(”test4/lua ” .. ((os.clock() - start) * 1000));
  9. end
复制代码
Test5
  1. function test5()
  2.     local v = cube.transform.position
  3.     local start = os.clock()
  4.     for i=1,20000 do
  5.         local v = GameObject()
  6.         v:AddComponent(SkinnedMeshRenderer)
  7.         local c=v:GetComponent(SkinnedMeshRenderer)
  8.         c.shadowCastingMode=0
  9.         c.receiveShadows=false
  10.     end
  11.     print(”test5/lua ” .. ((os.clock() - start) * 1000));
  12. end
复制代码
Test6
  1. function test6()
  2.     local transform=cube.transform
  3.     local start = os.clock()
  4.     for i=1,200000 do
  5.         local t=Quaternion.Euler(100,100,100)
  6.         local q=Quaternion.Slerp(Quaternion.identity,t,0.5)
  7.     end
  8.     print(”test6/lua jit  ” .. ((os.clock() - start) * 1000));
  9. 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设备长进行了测试,均得到相似的结论。因此,值得研发团队注意。
以上是我们对于目前市面上主流Lua版本的性能分析,但愿对大师在Lua版本的选择和使用上有所辅佐。但是,需要说明的是,框架的选择不应该只考虑性能,还需要考虑可维护性、不变性等其他维度,本测试仅供性能层面的参考,如果有相关疑问可以插手相关技术QQ群交流讨论:
ulua_tolua技术讨论群②:469941220
slua技术讨论群:15647305
文末,再次感激钱康来的分享,如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群465082844)。
也欢迎大师来积极参与U Sparkle开发者打算,简称”US”,代表你和我,代表UWA和开发者在一起!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-22 09:03 , Processed in 0.102971 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表