开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1667

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1308|回复: 11

[碧俐千仞] Unity3D热更新LuaFramework入门实战(9)——线程管理器

[复制链接]  [移动端链接]
排名
15496
昨日变化
3

17

主题

170

帖子

647

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
21
蛮牛币
1719
威望
0
注册时间
2014-11-6
在线时间
98 小时
最后登录
2017-4-15

专栏作家

发表于 2016-11-7 22:03:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 tyxxxx 于 2016-11-7 22:03 编辑

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

知乎 @罗培羽
1、GameManager的调用

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

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

Unity3D热更新LuaFramework入门实战9526.png

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

Unity3D热更新LuaFramework入门实战9615.png

再看看IsDownOk(代码如下所示)方法,当“下载完成列表”包含该文件时,说明下载已经完成,可以进行下一个文件的下载。
Unity3D热更新LuaFramework入门实战9678.png

2、ThreadManager的启动

ThreadManager启动时,开启一个线程“下载线程”,相关代码如下所示。由此ThreadManager仅仅是管理一条线程,而不是真正意义的线程管理器。
Unity3D热更新LuaFramework入门实战9778.png

3、AddEvent方法

AddEvent是给线程添加任务的方法,代码如下,其实就是给events队列添加一个值。
Unity3D热更新LuaFramework入门实战9838.png

Events的定义如下所示:
Unity3D热更新LuaFramework入门实战9856.png

ThreadEvent包含事件名key和参数evParams,代码如下所示。
Unity3D热更新LuaFramework入门实战9897.png

3、下载过程

“下载线程”执行了OnUpdate方法(代码如下所示),它调用OnDownloadFile下载文件。
Unity3D热更新LuaFramework入门实战9958.png

OnDownloadFile(代码如下所示)又调用了DownloadFileAsync下载文件,下载文件过程中ProgressChanged方法会被调用。
Unity3D热更新LuaFramework入门实战91039.png

ProgressChanged方法记录了下载进度,当进度为100%时,使用m_SyncEvent发送通知,相当于调用“回调函数”OnThreadCompleted。
Unity3D热更新LuaFramework入门实战91125.png

4、改进

这套线程管理器依然有“杀鸡用牛刀”之嫌,“任务列表”并没有实际作用(因为GameManager控制了下载进度,一个个下载),消息分发部分也太复杂,实际上只用回调函数之类的方法便能够实现。
个人认为线程管理器应当提供线程调度的方法,具体的下载逻辑可在GameManager中实现。而且下载功能不一定非要用线程,协程也能够解决,而且更简单。代码如下所示。
Unity3D热更新LuaFramework入门实战91308.png

由于热更新需要下载不少的文件,一个个下载实在太慢。如果能开启多个线程,同时下载,可在一定程度上提高下载速度。
框架并没有处理下载失败的情况,一般情况下,当一个文件下载失败,应当重试,在重试多次依然无法下载时,才弹出错误。

最后是广告时间:

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

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




评分

参与人数 4鲜花 +32 收起 理由
浮云zzy + 5 很给力!
残落秋枫 + 5 很给力!
lieb + 2 赞一个!
仅为年时 + 20

查看全部评分


回复

使用道具 举报

7日久生情
1827/5000
排名
1023
昨日变化
1

6

主题

300

帖子

1827

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
137142
好友
1
蛮牛币
8051
威望
0
注册时间
2016-2-21
在线时间
725 小时
最后登录
2017-4-24
发表于 2016-11-8 01:05:59 | 显示全部楼层
路过 给楼主点个赞 都出到9了不容易

回复 支持 反对

使用道具 举报

5熟悉之中
656/1000
排名
2775
昨日变化
2

0

主题

109

帖子

656

积分

Rank: 5Rank: 5

UID
67232
好友
1
蛮牛币
43
威望
0
注册时间
2015-1-9
在线时间
189 小时
最后登录
2017-4-21
发表于 2016-11-8 09:05:21 | 显示全部楼层
哇,不错不错

回复

使用道具 举报

6蛮牛粉丝
1115/1500
排名
1704
昨日变化

7

主题

269

帖子

1115

积分

Rank: 6Rank: 6Rank: 6

UID
104110
好友
0
蛮牛币
166
威望
0
注册时间
2015-5-29
在线时间
281 小时
最后登录
2017-4-19
发表于 2016-11-8 09:06:40 | 显示全部楼层
楼主,lua热更新能在appstore上用吗?

回复 支持 反对

使用道具 举报

排名
15496
昨日变化
3

17

主题

170

帖子

647

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
21
蛮牛币
1719
威望
0
注册时间
2014-11-6
在线时间
98 小时
最后登录
2017-4-15

专栏作家

 楼主| 发表于 2016-11-8 09:40:33 | 显示全部楼层
fairyzoro 发表于 2016-11-8 01:05
路过 给楼主点个赞 都出到9了不容易

再有一篇就完结了

回复 支持 反对

使用道具 举报

排名
15496
昨日变化
3

17

主题

170

帖子

647

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
21
蛮牛币
1719
威望
0
注册时间
2014-11-6
在线时间
98 小时
最后登录
2017-4-15

专栏作家

 楼主| 发表于 2016-11-8 09:40:53 | 显示全部楼层
eagle1098 发表于 2016-11-8 09:06
楼主,lua热更新能在appstore上用吗?

可以的,很多游戏就是用lua热更

回复 支持 反对

使用道具 举报

4四处流浪
342/500
排名
7048
昨日变化
2

1

主题

184

帖子

342

积分

Rank: 4

UID
173201
好友
0
蛮牛币
1295
威望
0
注册时间
2016-10-2
在线时间
41 小时
最后登录
2017-1-22
QQ
发表于 2016-11-8 09:57:28 | 显示全部楼层
好厉害!!!!!!!!!
[发帖际遇]: 心随情逝 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
787/1000
排名
2471
昨日变化
1

1

主题

205

帖子

787

积分

Rank: 5Rank: 5

UID
18721
好友
1
蛮牛币
957
威望
0
注册时间
2014-3-24
在线时间
173 小时
最后登录
2017-3-27
发表于 2016-11-8 19:57:38 | 显示全部楼层
来看看看~~~~~~~~~~~

回复

使用道具 举报

5熟悉之中
860/1000
排名
2257
昨日变化
2

2

主题

210

帖子

860

积分

Rank: 5Rank: 5

UID
19603
好友
0
蛮牛币
1682
威望
0
注册时间
2014-3-30
在线时间
206 小时
最后登录
2017-4-19
发表于 2016-11-9 08:45:09 | 显示全部楼层

感谢分享,学习一下

回复 支持 反对

使用道具 举报

0

主题

2

帖子

2

积分

Rank: 1

UID
182351
好友
0
蛮牛币
2
威望
0
注册时间
2016-11-9
在线时间
1 小时
最后登录
2016-11-10
发表于 2016-11-9 15:34:32 | 显示全部楼层
感谢分享,学习了

回复

使用道具 举报

5熟悉之中
621/1000
排名
3982
昨日变化
1

1

主题

192

帖子

621

积分

Rank: 5Rank: 5

UID
82215
好友
0
蛮牛币
150
威望
0
注册时间
2015-3-20
在线时间
180 小时
最后登录
2017-4-24
发表于 2016-11-11 11:48:12 | 显示全部楼层
恩,不错的分享.........

回复

使用道具 举报

6蛮牛粉丝
1435/1500
排名
1087
昨日变化
1

5

主题

202

帖子

1435

积分

Rank: 6Rank: 6Rank: 6

UID
10760
好友
1
蛮牛币
3034
威望
0
注册时间
2013-12-20
在线时间
406 小时
最后登录
2017-3-23
发表于 2017-3-22 17:17:07 | 显示全部楼层
大神分析的很好,这个ThreadManager可以叫做DownloadActionManager,是一个下载任务管理器。而且并没有起到管理多线程的作用。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

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