啥是运行时下载清单?现在大多数手游都会有一个边玩边下功能,会提示用户是否开启下载,要XXX流量,如果你下载完了,可能还会有奖励。
疑问:为何要有边玩边下功能?
解答:为了发包的包体小,并且是越小越好!
我们的游戏想要赚钱,第一步就是让用户下载你的游戏,其次才是考虑留存的问题。
如果你的首包就是10个G,用户直接就开骂了,想让老子下载10G的包,你得多大面子。
首包到底该多大,多少需要热更,多少需要游戏内下载是个玄学问题,没有标准答案。
我认为首包的资源起码应该保证新玩家能玩个一两天不需要下载的量。
也有的公司够粗暴,首包只有框架,资源和业务代码全部热更。
除了提示用户下载,不知道有没有公司会不提示偷偷下载,或者检测如果是WIFI状态下,偷偷下载,如果不提示就让用户浪费了流量,可能涉嫌违法。
AB包如何区分是启动时热更还是边玩变下?
我把第一篇文章的内容以及AB包清单粘贴过来,
第一行是SVN版本号
第二行是AB包数量
从第三行开始是资源包信息,以=号分割开有效数据,分别是
MD5.unity3d = 资源路径 = 资源路径的HashId = 包体KB大小 = SVN版本号 = 启动热更模式
上面说的热更启动模式就是专门用来做这个的标记,我们项目中buildin代表启动时热更,InGame代表边玩边下。
下面是收集边玩边下列表的代码,代码比较简单,就是判断下载列表的每一行,如果Tag标记是InGame,那么就加入边玩边下列表。
private void GetDownloadList(PatchManifest target)
{
string style = PatchHelper.GetPackStyle();
MotionLog.Log(ELogLevel.Log, $"getDownloadList style is {style}");
if (style == PATCH_STYLE.INGAME && _patcher.DownloadInGame)
{
_patcher.InGameDownloadList.Clear();
// 临时下载列表
List<PatchElement> downloadList = new List<PatchElement>(1000);
// 准备下载列表
foreach (var pair in target.Elements)
{
PatchElement element = pair.Value;
if (element.Tag == PATCH_STYLE.INGAME)
{
downloadList.Add(element);
// yield return 0;
}
}
// 如果下载列表为空
MotionLog.Log(ELogLevel.Log, $"FsmGetInGameDownloadList count is {downloadList.Count}");
if (downloadList.Count > 0)
{
// 最后添加到正式下载列表里
_patcher.InGameDownloadList.AddRange(downloadList);
downloadList.Clear();
// 发现新更新文件后,挂起流程系统
_patcher.inGameCnt = _patcher.InGameDownloadList.Count;
_patcher.inGameSizeKB = 0;
foreach (var element in _patcher.InGameDownloadList)
{
_patcher.inGameSizeKB += element.SizeKB;
// yield return 0;
}
// PatchEventDispatcher.SendFoundUpdateFilesMsg(totalDownloadCount, totalDownloadSizeKB);
}
}
_patcher.SwitchNext();
}