Skip to main content
AR论坛
 首页 » 资源教程 » Unity3D教程

Unity3D热更新LuaFramework入门实战(9)——线程管理器

2016年10月15日 17:54:462160@罗培

LuaFramework内置了线程管理器ThreadManager,一开始我以为这是个创建线程、终止线程等方法的封装。然而不是,它是热更新时使用线程下载资源的具体实现。那让我们来看看线程管理器的工作原理吧。


1、GameManager的调用

那么先看看在热更新过程中哪些地方调用到ThreadManager。热更新由GameManager执行(相关代码如下图所示),它在对比本地文件和网络资源的差异后,将需要下载的文件名存放到列表中,然后遍历列表,调用BeginDownload下载。从代码可以看出,它通过ISDownOK判断该文件是否下载完成,然后下载下一个文件,一个个的下载文件。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第1张

BeginDownload(代码如下所示)便调用ThreadManager的AddEvent方法。ThreadManager并不是真正意义上的线程管理器,它只管理一条“下载线程”,通过AddEvent将要下载的文件名放到“代办列表”中,该线程依次下载它们。其中的OnThreadCompleted是“回调函数”,在下载该文件后,会通过消息的方式回调它。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第2张

在“下载线程”下载完一个文件后,它以通知的形式调用“回调函数”OnThreadCompleted(代码如下所示),该方法将会设置“下载完成列表”downloadFiles。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第3张

再看看IsDownOk(代码如下所示)方法,当“下载完成列表”包含该文件时,说明下载已经完成,可以进行下一个文件的下载。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第4张

2、ThreadManager的启动

ThreadManager启动时,开启一个线程“下载线程”,相关代码如下所示。由此ThreadManager仅仅是管理一条线程,而不是真正意义的线程管理器。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第5张Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第6张

3、AddEvent方法

AddEvent是给线程添加任务的方法,代码如下,其实就是给events队列添加一个值。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第7张

Events的定义如下所示:

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第8张

ThreadEvent包含事件名key和参数evParams,代码如下所示。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第9张

3、下载过程

“下载线程”执行了OnUpdate方法(代码如下所示),它调用OnDownloadFile下载文件。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第10张

OnDownloadFile(代码如下所示)又调用了DownloadFileAsync下载文件,下载文件过程中ProgressChanged方法会被调用。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第11张

ProgressChanged方法记录了下载进度,当进度为100%时,使用m_SyncEvent发送通知,相当于调用“回调函数”OnThreadCompleted。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第12张

4、改进

这套线程管理器依然有“杀鸡用牛刀”之嫌,“任务列表”并没有实际作用(因为GameManager控制了下载进度,一个个下载),消息分发部分也太复杂,实际上只用回调函数之类的方法便能够实现。

个人认为线程管理器应当提供线程调度的方法,具体的下载逻辑可在GameManager中实现。而且下载功能不一定非要用线程,协程也能够解决,而且更简单。代码如下所示。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第13张

由于热更新需要下载不少的文件,一个个下载实在太慢。如果能开启多个线程,同时下载,可在一定程度上提高下载速度。

框架并没有处理下载失败的情况,一般情况下,当一个文件下载失败,应当重试,在重试多次依然无法下载时,才弹出错误。


最后是广告时间:

《16年的长度 记录中国独立游戏》从十多年前程序员写的小玩儿,到如今使用游戏引擎开发的炫酷产品,独立游戏作者的故事见证了我国游戏业的发展历程。来看看国产单机的造梦者们,在这十几年中做出怎么的作品,现在又过得如何。

16年的长度 记录中国独立游戏


《仙剑5前传之心愿》是笔者两年前发起的一款仙剑同人游戏,使用Unity3D制作,是市面上第一款能够完成的3D仙剑同人游戏。如今我们各自踏上游戏开发一途,似乎要做点什么以致敬国产经典之作,在追求商业成就的同时,勿忘初心。可以在www.pal5h.com下载该游戏。《仙剑5前传之心愿》截图如下。

Unity3D热更新LuaFramework入门实战(9)——线程管理器 Unity3D教程 第14张

更多AR教程就在中国AR网(http://www.chinaar.com/)

中国AR网(微信公众号:armeiti)

评论列表暂无评论
发表评论