共有回帖数 1 个
-
0. 前言
2016年8月从网易“毕业”,在新的公司开始新的工作,这其中的波折与故事暂时不提,等以后有时间的时候再另开文章总结回顾。全新的手游项目从零开始,使用Unity引擎开发一款手游项目,本系列札记主要针对开发过程中重要的部分进行记录和总结,一方面方便自己日后回顾,也希望可以给遇到类似问题的朋友一些提醒和启发。当然,自己在Unity引擎和Lua语言方面都是新手,更加希望抛砖引玉,针对遇到的问题进行更广泛的讨论和更多大牛的提点。具体到本篇文章的主题,主要是Lua语言和Unity引擎的集成。这是我最近一个月左右的时间一直在尝试解决的问题,本文主要记录方案的选择和对比,以及针对选择的方案自己进行的一些改造和思考。
1. 为什么要集成Lua语言
有句从知乎开始发展起来的名言叫做——“先问是不是,再问为什么”,类似地,在做一个技术方案的时候,“先问为什么,再考虑如何做”。那我们第一个问题就是要解决这个项目“为什么要集成Lua语言”?在网易内部,一向遵守的传统是逻辑用脚本来做,比如Python、Lua等,好处主要有如下几点:
利用脚本语言的动态特性,客户端可以做Hotfix,服务端可以做Refresh,无论在运营还是开发期这一特性都很有用;脚本语言运行在虚拟机中,它把游戏进程搞挂的概率相比C/C++等静态语言要低;脚本语言相对好学习一些,对于新手来说上手难度较低,比如Python,当然要精通也需要时间和经验的积累;当然还有其他的优点,对应的缺点就在于运行效率比C/C++低不少,相对于静态语言在编译器有完备的语法检查,动态语言更容易出一些运行时的错误,调试难度相对大一些。而对于Unity引擎,因为它已经选择了C#作为对应的脚本语言,因此再集成一门Lua语言显得有些多余。核心的原因还是在IOS设备上因为使用了IL2CPP,无法实现像Android上面那样直接替换DLL的方式来进行更新,这导致游戏逻辑如果出现错误,不但无法Hotfix修复,甚至连Patch都不能修复,只能重新提包。虽然APP Store现在对于应用的审核速度已经变快, 但是仍然需要2-3天以上的时间,这对于需要快速反应的商业游戏来说是无法容忍的。目前了解到的业内常用的做法主要有如下几种:
纯C#开发的方式,比如腾讯这种大厂,某些工作室的做法就是完全使用C#来进行开发,尽量做到功能逻辑可配置,这样出现某些重大问题可以通过更新数据的方式把逻辑暂时关闭掉。逻辑的更新安卓使用替换DLL的方式,IOS使用重新提包的方式。对外测试以安卓为主,并且大厂有比较好的QA团队进行质量保证,因此可以做到IOS最终上线的品质和bug都是相对少的。C#做核心逻辑,Lua做UI和活动玩法等执行频率低,需求变动较大的部分。这是目前了解到的一些创业团队使用得比较多的做法,在效率和可更新性之间的一个折中。以Lua为主的方式。也了解到一些公司的团队,包括网易内部的一些项目,使用逻辑都以Lua语言来写的方式进行开发。从网易之前的经验来看,逻辑使用纯脚本的方式并不会有太大问题。我们要开发的产品是一款商业游戏,对于出现问题快速响应的需求相对强烈,因此在Unity中使用Lua语言是必不可少的,至于多大范围地应用它,初步是计划大部分功能都是用Lua语言来开发,并制定每隔一段时间周期进行性能测试和评估的方式来确保性能可以满足需求。
2. 怎样集成Lua语言
在决定要使用Lua语言之后,要面临的问题就是如何在Unity中去集成它。可选的方案有很多,各种方案的实现原理也不尽相同,早期有各种在C#语言内部实现Lua虚拟机的,也有利用反射动态查找脚本的,但是目前比较主流的两种方案是ToLua#和SLua这两种方案。
2.1 性能对比测试
这两个方案的原理都相似,基于LUAInterface,在开发时将C#的接口导出为Lua的版本,通过LuaState的栈结构来进行两种语言之间方法调用。这两个开源项目针对性能对比在网上打了不少口水仗,到底谁更优秀很难公允地评价,因为作为一个中间件性质的开源项目,除了性能之外还有生态圈、易用性等各个方面的问题需要考量。网上有不少对比的帖子可以自己搜索一下,这里不进行详述了,以免引起论战。在这一部分我们最终选择了ToLua#,原因我是自己在安卓设备上进行测试了结果。钱康来前段时间发了一个帖子来对比几款Unity中Lua集成方案的性能,Unity常见lua解决方案性能比较,这篇文章也整理投稿到了UWA博客中,我自己基于测试用例在锤子T2上进行了简单的性能测试,结论和这篇博客中的基本一致,未整理的数据如下表所示。
框架test1test2test3test4test5test6SLua755.004 623.61934.1266812.411648.680.6352ToLua#634871.2297.83056.21139.41.206数据的单位是毫秒,测试是进行五次测试的平均值,使用锤子T2进行。这次测试并不严谨,只是为了亲自验证一下两者之间的性能差异到底是什么样子的。每一个测试用例的代码可以参考前文提到文章,这里只简单进行说明:
test1是简单的属性操作;test2和test3是向量的操作;test4是GameObject的创建;test5是创建GameObject并进行一些属性操作;test6是对四元数进行操作。2.2 性能差异的可能原因之一
个人感觉ToLua#在属性操作方面性能较好,而Vector的向量操作,因为可能会有Lua层的优化,即在Lua层完全实现了对应的操作,因此需要针对源码进行详细的对比。至于性能差异的原因,我没有从Lua虚拟机的实现部分分析,只是查看两种生成Warp后的接口进行一个简单的猜想。选取同一个接口进行对比,UnityEngine.Animator的GetFloat接口,ToLua#的实现如下:
楼主 2016-11-16 18:28 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知