1.什么是LuaMVC
从工作以来一直从事工业三维仿真软件/AR软件的开发,每个项目开发周期短,项目从Demo到完(huang)结(le)时间较为紧凑,因此需要一个便捷的开发框架作为支撑,以适应不同的项目需求,而且需要尽可能覆盖多个终端( web/android/ipad)的需求。
LuaMVC是根据以上需求基于PureMVC框架和XLua热更新解决方案开发的支持热更的MVC框架,框架继承了pureMVC框架的编码方式,包括lua部分代码也继承了View/Mediator,Model/Proxy,Command/Controller的方式,LuaMVC新增了Service/Hadnler模块,以更好的适应与远程服务器的交互,同样继承了XLua的热补丁功能。LuaMVC还提供了Unity3D中AssetBundle资源更新的解决方案,Lua脚本自动更新等其他基础工具。下面来详细了解一下LuaMVC吧!
1.1 什么是Lua
学术解释
Lua设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。[1.百度百科Lua]
Lua的目标是成为一个很容易嵌入其它语言中使用的语言。很多应用程序使用Lua作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。[2.维基百科Lua]
Lua官方的解释。[3.Lua官网]
简单解释
因为Lua可即时编译的特性使得Unity3D可以在运行时动态地加载Lua进来并执行Lua代码中的代码。也就是说如果业务逻辑是Lua写的,那么Unity3D的程序就不需要重新Build项目和部署项目,只需要将新的Lua文件(在Unity3D开发中通常是.txt文件)导入客户端中即可。
我们的Lua代码该如何被C#代码所调用呢?XLua为我们提供了这样的环境。
1.1.1 什么是XLua
xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。(xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc.) 更多XLua的详细内容查考[4.XLua Github]
1.1.2 其他热更新解决方案介绍
过于严谨的效率不在我们这篇文章的考虑范围之内,目前较为熟知的热更新解决方案还有:
- slua: github中也提供围绕slua的众多的框架,其中mr-kelly/KSFramework是最为完善的一个。官方解释:KSFramework是一个整合KEngine、SLua(或XLua、ILRuntime)的Unity 5 Asset Bundle开发框架,并为程序、美术、策划、运营提供辅助工具集。
- ulua/tolua,LuaFramework是基于SimpleFramework + tolua #基础上,重新构造的新框架~
框架自带了LuaBundle模式(直接讲lua文件打进Assetbundle)+ 重构的资源管理器。- ILRuntime,ILRuntime项目为基于C#的平台(例如Unity)提供了一个纯C#实现,快速、方便且可靠的IL运行时,使得能够在不支持JIT的硬件环境(如iOS)能够实现代码的热更新
- JavaScript Binding 在线文档 JSBinding一个可以让你用javascript脚本编写unity3d逻辑的工具。
1.1.3 为什么采用XLua
虽然从诸多Lua热更新解决方案的性能对比文章中对比得知XLua并非是性能最好的解决方案,但是我依旧决定采用XLua是因为以下原因:
- 腾讯大厂开源,持续稳定的更新
- XLua的热补丁,热补丁可以在某一段C#代码中注入Lua代码,执行完Lua代码之后继续执行C#代码的能力,这样意味着平时的开发可以用C#,效率/性能都得到保证
- 出色的GC优化
- 最重要的原因!!!上手比最流行的ulua更容易
Lua性能对比文章供大家参考
Unity项目常见Lua解决方案性能比较
Unity中SLua、Tolua、XLua和ILRuntime效率评测
1.2 什么是MVC
MVC不是一种技术,仅是一种理念。MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。
- 控制器(Controller)- 负责转发请求,对请求进行处理。
- 视图(View) - 界面设计人员进行图形界面设计。
- 模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
MVC结构图
一个最简单的MVC案例(javascript实现)
/** 模拟 Model, View, Controller */
var M = {}, V = {}, C = {};/** Model 负责存储数据 */
M.data = "hello world";/** View 负责显示数据 */
V.render = (M) => { console.log(M.data); }/** Controller 作为Model和View之间数据传输的中间者 */
C.handleOnload = () => { V.render(M); }/** 执行渲染请求 */
window.onload = C.handleOnload;
1.2.1 什么是pureMVC
如果你对pureMVC(标准版)不了解,可以先浏览一下以下两篇博客:(多核版本可自行google学习)
- pureMVC框架解读(上)
- pureMVC框架解读(下)
维基百科中这样解释:
The Model, View and Controller application tiers are represented by three Singletons (a class of which only one instance may be created).
The MVC Singletons maintain named caches of Proxies, Mediators and Commands, respectively. The Facade, also a Singleton, provides a single interface for communications throughout the application. These four Singletons are referred to as the Core Actors.
- Data objects, be they local or remote, are managed by Proxies.
- The View Components that make up the User Interface are managed by Mediators.
- Commands may interact with Proxies, Mediators, as well as trigger or execute other Commands.
1.2.2 为什么采用pureMVC
对Unity3D框架有所了 解的人都知道有[5.strangeIOC](StrangeIOC 是一个轻量的高扩展性的控制反转框架,专为C#和Unity而设计),而且StrangeIOC使用的人数也更多一些,结合我体验过StrangeIOC的感受来说一下为什么采用pureMVC
- pureMVC设计和思路相比StrangeIOC来说更为简单,更容易在多人项目中推进
- 用pureMVC的思路将XLua热更新解决方案继承到框架中更为简单
至于pureMVC的缺点我们下面再分析。
2.LuaMVC框架的优势与缺陷
2.1 先谈优势
- 优化了pureMVC(标准版)中每次Notification都会调用反射执行已注册事件的严重缺点
- 优化了pureMVC.Mediator中对View(视图)操作反复拆装箱的操作
- LuaMVC框架用C#编码和lua编码风格完全一致
- 对计算性能要求较高的模块(战斗模块)或者是不易变动的模块可全用C#进行开发,对将来可能需要热更的模块采用lua编写
- 利用pureMVC事件通知的特性,可方便新增/更新功能C#编写的功能
- xlua的热补丁功能,可只再修复bug时利用lua,其余全用C#编码(这个功能的使用有待思考,因为需要有预见性地在C#代码种标注Hotfix标签)
- LuaMVC也提供了AssetBundle解决方案(官方[6.AssetbundleManager]的分支版本)
- 架构逻辑简单,弄清框架逻辑流程相对容易
- 多人开发容易推广
- ……
2.2 再谈缺陷
对于LuaMVC缺陷我有最深的体会,从最初模仿pureMVC的springMVC框架到pureMVC再到LuaMVC,流程控制可能是LuaMVC框架最致命的缺点,因此也限制了它的使用范畴,但是如果你能够合理的规划通知的名称和业务流程的合理规划,这也不将成为什么问题。
- 流程控制,流程交互依靠Notification(事件通知),事件需要拟定一个string类型作为事件的名称,在随着项目庞大起来,很多个事件的不合理命名可能会让你觉得事件流程特别难以控制,特别是新的程序员加入这个项目中时。但是IDE的升级和事件名称合理的命名可以解决这个问题,多写几个项目就知道该规避这一问题。
- 代码数量多,每个模块都要生成View/Mediator,Model/Proxy,Service/Handler甚至Command
2.3 LuaMVC只是一种解决方案的思路
LuaMVC中的pureMVC可能不符合你的预期,你可以把pureMVC框架置换成strangeIOC或者自己的框架。如果你觉得LuaMVC中XLua不符合你对lua性能的需求,XLua也可以用uLua/toLua来代替。
LuaMVC是我工作经验的总结,可能并不适合每一个项目,开源目的:
- 总结经验
- 开源更有利于进步
- 为初入Unity3D的新手提供一个对框架的初步认知
3.LuaMVC适合什么样的应用场景
经过分析LuaMVC的优势与缺陷,LuaMVC能不能经得起较为庞大项目的考验尚不明确,但是可以很稳定适用于一下项目:
- VR/AR展示软件
- 工业三维仿真软件
- 休闲娱乐游戏(同步率不高的游戏,高同步的尚不明确)
- 项目demo
4.LuaMVC内容简述
LuaMVC提供基于pureMVC+XLua的核心事件交互机制及热更的方案之外,还提供了诸多的工具类,辅助项目/游戏的开发。后续我们依次讲解
框架核心
- 第一篇:PureMVC详解,介绍PureMVC中涉及的C#语法特性和所涉及的设计模式,并改进pureMVC标准版中在C#中因反射而造成的性能瓶颈,并拓展MVC为MVCS框架,增加PureMVC与远程服务器的交互能力。
- 第二篇:Lua的简介与XLua的简介,学会XLua使用方式,以及如何在Lua中实现面向对象的编程方式。
- 第三篇:Lua与C#混编的思考,Lua应该占据代码中多大的比例,以及在使用LuaMVC时我们应该注意什么。
- 第四篇:ViewMaster详解,如何将UI框架构建到LuaMVC原型中,如何让LuaMVC自动管理所有View,ViewMaster的功能设计与使用。
框架核心工具
- 第五篇:AssetBundle工具的构建,AssetBundle包含了哪些功能,在使用AssetBundle打包资源时应该注意哪些事项以及如何优化已有的项目资源。
- 第六篇:LuaMVCConfig配置工具,为什么我们需要为LuaMVC提供一个配置工具,以及它具体包含了什么内容。
框架基础工具
- 第七篇:对象池详解,对象池在Unity3D使用的意义,如何构建一个适合自己的对象池。
- 第八篇:线程池详解,为什么要使用线程池,刨析Unity3D的多线程编程。
- 第九篇:TimeMaster事件工具详解,在游戏/项目中时间总是一个很重要的概念,TimeMaster可以为我们提供什么样的功能,TimeMaster API详解。
- 第十篇:Setting工具详解,如何在Unity3D运行时动态调节项目的参数,阴影设置,锯齿设置等。
- 第十一篇:AudioEnty工具详解,为什么需要音频控制器,它应该包含什么样的功能。
- 第十二篇:数据加密工具与密钥的生成管理。了解简单的加密算法与封装。
- 第十三篇:基础辅助工具,配置文件读取,单例父类,协程工具等。
项目经验总结与合理规避
- 第十四篇:代码优化/内存控制,项目路径问题等前期规避问题。
- 第十五篇:关于Android/iOS开发环境配置与发布以及真机直连PC调试。
简述网络模块
- 第十六篇:Pomelo框架简介与如何与LuaMVC建立联接,如何部署Pomelo到Linux,如何用NodeJS快速搭建并部署WebServer。
框架体验(案例)
- 第十七篇:从零到一用LuaMVC快速开发小游戏。
关于LuaMVC框架
源码 : https://github.com/ll4080333/luaMVC
如果对你有用,记得点一波Star,关注博客哦。
LuaMVC是我在项目种的经验总结,如果恰巧你也需要这样的框架来快速开发,那你可以期待后续的更新哦。
如果你有什么更好的意见与建议欢迎加留言或者加群:LuaMVC/SpringGUI交流群 593906968 。