每个游戏都有自己的启动流程框架,有简有繁,但是抽象出来总归就是那么几个步骤,今天我们聊一聊这些步骤。
第1步:启动
第2步:判断当前设备所处环境是内网还是外网环境
原因:一般来说内网环境和外网环境在最终的服务器列表展示是不一样的,外网是正式的服务器列表,内网则是一些测试的服务器列表
实现:www请求一个内网的url,如果请求成功则说明在内网环境
第3步:根据包体内固定的设备平台的url【可能安卓/ios/Editor的url不一样】以及内外网标识等信息去获取对应的公告url,AssetBundleUrl,AppUrl,AppVersion,ServerList等
第4步:比对LocalAppVersion和RemoteAppVersion,如果不一致,则弹框提示去AppUrl下载新的App.否则继续后面流程
第5步:初始化SDK环境【例如 此时初始化360的SDK】
第6步:检测本地AssetBundle文件的变更,更新LocalAssetBundleList
原因:懂技术的同行们或者刚带代码离职的开发者可能会打开AssetBundle所在的目录去修改某些AssetBundle内容,从而达到修改游戏逻辑,或者游戏数据的目的。
实现:客户端自己试加载所有在LocalAssetBundleList中的AssetBundle文件,使用LocalAssetBundleList中AssetBundle文件对应的crc校验码去校验这个加载的过程,如果校验失败,说明这个AssetBundle文件被修改过,或者被破坏了。那么就从LocalAssetBundleList中删除。当然如果LocalAssetBundleList这个文件也被破坏了导致程序识别不了格式,那么就粗暴认为这个列表为空,需要全量下载所有的AssetBundle文件。
【LocalAssetBundList是客户端本地存储的一个加过密的文件 主要内容是一个字典,key为AssetBundle,Value为AssetBundle相关的信息,比如大小,位置,crc等,web服务器也有一份叫做RemoteAssetBundleList】
第6步:根据AssetBundleUrl下载对应的RemoteAssetBundleList文件,也就是下载web端最新的AssetBundle列表
第7步:将RemoteAssetBundleList和LocalAssetBundList进行比对差异,查找crc发生变化的,客户端多余的或者缺少的AssetBundle文件,然后更新到LocalAssetBundList
实现:高效实用Hash比对,得到差异列表DownloadAssetBundleList
第8步:下载DownloadAssetBundleList中标识的AssetBundle文件, 界面展示一个下载进度展示。
第9步:进入选服登陆界面,等待玩家选服登陆。
QA:
1:为什么不使用LocalAssetBundleVersion和RemoteAssetBundleVersion去比对,如果两者一致就不执行后续的AssetBundle流程的这个方式呢?
答:因为两者一致的情况下,可能客户端本地的一些AssetBundle文件已经被修改了,所以两者一致其实严格意义上来说,是不能说明所有的AssetBundle也是一致的。
2:AssetBundle文件过多,下载耗时过长有没有什么优化方法?
答:
(1)想办法减少AssetBundle的文件个数
(2)将多个AssetBundle文件挤压成一个文件【挤压格式自己设计】这样可以较少与web通信的次数,从而节省耗时
(3)多线程下载
本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/yx/67918.html