YooAssets官方流程分析HostPlayMode(联网)模式下资源更新流程。
资源更新流程:
_machine =newStateMachine(this);
_machine.AddNode<FsmPatchInit>();
_machine.AddNode<FsmUpdateVersion>();
_machine.AddNode<FsmUpdateManifest>();
_machine.AddNode<FsmCreateDownloader>();
_machine.AddNode<FsmDownloadFiles>();
_machine.AddNode<FsmDownloadOver>();
_machine.AddNode<FsmClearCache>();
_machine.AddNode<FsmPatchDone>();
_machine.Run<FsmPatchInit>();
1.初始化[FsmPatchInit]
初始化所做的事情:
创建HostPlayModeImpl对象[实现接口IBundleServices],并执行HostPlayModeInitializationOperation初始化流程。
HostPlayModeInitializationOperation所干的事情:
a.从沙盒路径加载Manifest。
b.假如加载成功,则根据Manifest验证沙盒路径bundle的完整性。
c.假如加载Manifest失败,则先读取App内置资源的版本号[默认PatchManifest_DefaultPackage.version文件],然后根据版本号加载内置资源的Manifest,并拷贝到沙盒路径,再根据Manifest验证沙盒路径bundle的完整性。
注:校验成功的bundle,会缓存到CacheSystem中。缓存过的bundle,不会再次校验
2.版本号更新[FsmUpdateVersion]
版本号更新很简单,即使用HostPlayModeUpdatePackageVersionOperation对象从远端下载资源版本文件[PatchManifest_DefaultPackage.version],并保存 到PatchManager.Instance.PackageVersion。
3.Manifest更新[FsmUpdateManifest]
Manifest更新使用HostPlayModeUpdatePackageManifestOperation,步骤如下:
a.计算沙盒路径Manifest的md5码。
b.如果计算成功,加载Web端Manifest的md5值,保存在PatchManifest_DefaultPackage_xxxx.hash文件中[打包时会生成此文件,表示远程版本]。xxxx表示版本号,即步骤2中更新到的版本号。
c.对比本地Manifest的md5值和服务器的Manifest的md5码值。
d.如果md5码相同,则重新加载沙盒路径Manifest[步骤1中已经加载过]。
e.如果md5码不相同,则从服务器下载载Manifest,并存储到沙盒路径。
f.Manifest已经加载或者更新完成,此时根据Manifest验证沙盒目录下bundle的完整性。校验成功的缓存CacheSystem。
4.创建资源下载器[FsmCreateDownloader],此步根据自身项目需求,创建下载全部资源的下载器或者只下载固定tag的下载器。在创建下载器时会计算下载列表。在计算过程中,会先检查CacheSystem,缓存的不下载。再检查InApp的随包资源,随包资源也不下载。
注:每次生成打包资源生成bundle时,bundle都是唯一的,有改变的bundle会根据规则生成一个新的名字。因此,如果随包资源有改变时,此时也会更新下载最新资源,因为Manifest已经改变。
5.下载资源[FsmDownloadFiles]。
6.下载完毕[FsmDownloadOver],没实际内容。
7.清除多余无用的bundle[FsmClearCache]。
8.更新下载流程完毕,启动游戏逻辑[FsmPatchDone]。
以上即为基本更新流程。
思考:在常见单机游戏中,更新Manifest后,后续玩家更新bundle过程中,如果玩家网络很差甚至断网,由于新的Manifest已经更新,而bundle又不全,玩家又没网,此时不能进入游戏。
此时需要bundle完整更新后,在写入服务器Manifest,或者需要恢复本地Manifest接口。当前框架暂不支持,已联系作者支持。
版权归原作者 lcl20093466 所有, 如有侵权,请联系我们删除。