大家好,我是阿赵。
最近有几个项目,都在上线的时候,遇到了包体容量的问题。
比如有一个项目,上QQ大厅平台,QQ大厅平台强制要求包体容量不能超过250M。另外一个项目,上谷歌商店,包体容量限制不能超过1G。
阿赵我之前做的项目,都是可以自定义包体容量的,比如游戏实际容量是600m,我出一个100m左右的包体就可以,基本上不会让玩家有异常的感觉。但由于各种原因,近2年做的项目,并没有做这种分包的底层,结果就遇到问题了。
其实,就算平台不限制包体容量,你的发行渠道肯定也希望你做的包体越小越好的,因为投放广告买量,包体大,价格也会贵,而且玩家看到包体大可能会影响下载的欲望。
这里有些朋友可能会说,现在的大作游戏,动辄几个G以上很正常,而且真正的玩家,看到大容量的游戏才会觉得是游戏,那些几百M的小游戏,玩家一看就会觉得不好玩。是的,如果真正的玩家,我相信一定是这样想的,包括我自己也是这样。不过可惜的是,我们现在做游戏的目的都是为了赚钱,实际上真正的用户对象并不是那些核心玩家,除非是有大IP的游戏,不然都是各种求着玩家关注,求着玩家感兴趣下载,求着渠道给量,所以需要考虑的问题就已经远远不止怎样把游戏做得好玩,做得好看了。
废话不说了,下面来讲几种比较常见的减少包体容量的方案。这些方案,我大部分都做过,不过基于不想被玩家打的原因,我是不会说我哪些项目使用了哪种技术的。我基本上是按照在行业里面出现的先后顺序来介绍的,所以可能后面的方法会体验比较好一些。
一、首次启动游戏之后,再下载资源包。
这种方案在早期的安卓游戏里面比较常见。早期做过国外安卓游戏翻译的朋友应该知道,谷歌市场一直都是推行游戏资源分离的做法的,比如一个apk安装包,他实际上只包含基础逻辑,然后另外一个资源包,里面才是真正的游戏资源。所以一般我们安装完apk之后,还需要继续下载一个额外的资源包,才能真正进入游戏。而翻译工作,一般就是针对那个资源包来进行的。
下面来评价一下这种做法的优缺点:
1、优点:
这种方案实现最简单,基本不需要对游戏进行很大的修改,只需要把资源提取出来,然后放到CDN分发网络,然后在游戏启动的时候,去访问CDN,把指定的资源下载到本地,然后解压缩。之后资源就已经存放在手机本地了。
2、缺点:
这种是体验最不好的做法,玩家在安装玩游戏之后,满心期待的想进入游戏体验,结果发现还需要继续下载一个很大的资源包。有可能看到这个下载提示的时候,玩家就已经对游戏失去兴趣了。或者在漫长的等待中,玩家就放弃了。因为在市场下载,就算包体再大,手机也是后台下载的,但如果在游戏内部通过自己的逻辑去下载资源,就只能停留在游戏的画面里面等待。
做得人性化一点,可以开一个后台服务,然后去下载,或者在下载的过程中显示一个小游戏之类。总之体验都不是很好。
二、先提供一段新手期试玩,然后下载资源包
为了解决这种极度打击玩家兴趣的问题,所以有些游戏就改变了做法,并不是一进入游戏就立刻下载资源包,而是在基础的包体里面,包含了一个新手试玩内容,比如提供第一章节的游戏内容,让玩家可以在刚安装完游戏之后,立刻能体验一部分的游戏内容。然后当章节结束的时候,再提示玩家是否下载资源以继续后面的章节。
这种方案在国外游戏行业比较流行的,国外制作游戏的同行,他们比较愿意花精力去研究怎样让游戏变得好玩,而并没有花很多心思去做一些满足渠道要求的东西。
1、优点:
能在尽量不打击玩家兴趣的前提下,解决了包体容量的问题。因为在体验了第一章节的游戏内容后,如果不感兴趣的玩家,不管是否下载资源,他都会流失了。如果对游戏感兴趣的玩家,他有可能不会介意等待下载。
实现难度不会很大,相对集中的把新手期需要的内容打在首包内,然后其他的内容就可以放到包外去下载。
2、缺点:
首包的容量不会很小。由于需要让玩家体验一个阶段的游戏内容,所以实际上游戏的基础玩法要整个都包含在首包里面,而且要包含这个阶段用到的所有美术资源,所以并不能做到首包非常的小。
然后,避免不了长时间的等待。在体验完新手内容之后,游戏正式内容还需要下载比较大容量的资源包,不然而已不需要分包了。这个过程中,玩家还是会有可能由于下载时间过长,而不愿意继续等待。
最后,对于老玩家来说没用。有些玩家已经早就过了新手阶段,他是由于各种原因,比如换手机,或者之前删除了现在突然想玩,就再次下载游戏的。这部分玩家,会跳过新手体验阶段,直接就需要下载资源包了。
三、根据游戏进度,每个阶段下载一个资源包
这种方案是在第二种方案的基础上再细分的。在提供完新手体验内容之后,每一个新章节,都提供一个新的补充资源包,在玩家进入新章节的时候,再提示玩家下载。
我最早见到这种做法的游戏,是很多年前的《神仙道》手游。那时候每结束一个章节,都会提示下载资源。
1、优点
这种做法基本上解决了第二种方案的几个问题,由于不需要一次性下载完所有资源,所以每一个章节的下载时间并不会很长。而且对于老玩家来说,已经过去了的章节,可以不需要下载,或者玩家手动选择回到旧章节的时候,才去下载。
2、缺点
现实难度大,主要是资源划分难度比较大。各个章节需要什么游戏内容,需要人手去统计,并且划分资源包,这个工作虽然技术含量不会很高,却很麻烦,而且很容易出错。假如一个不慎,一个需要的资源没有归纳到某个章节,游戏运行的时候就会出错。
然后,如果游戏不能绝对的划分章节内容,或者章节直接的资源都是共用的,这种方案明显就不能适用了。
四、根据地图来划分资源下载包
这种方案和第三种方案有点类似,只是划分资源包的依据不是章节进度,而是以地图为单位。比如玩家的游玩过程是在一个很大的世界地图里面进行的,而每次进行游戏,玩家都必须先选择进入世界地图里面其中一张小地图进行,在这个前提下,对游戏资源进行地图的划分,比如A地图里面包含了那些基础资源,哪些怪物和NPC,在进入A地图之前,就把这些内容下载下来,再进入。
前段时间出的《暗黑破坏神不朽》,就是以这种方式来分包的。
1、优点
包含了第三种方案的所有优点,并且降低了统计资源的难度。只要很明确的划分每张地图会出现的美术资源,就可以把资源划分得比较准确,最后一些共用的,无法划分的资源,就放到一个基础资源包里面下载就好了。
2、缺点
并不是所有游戏类型都有进入地图的概念,比如最近很流行的大地图SLG游戏,整个游戏过程就是一张地图,没有办法划分。所以一般这种做法比较适合RPG类游戏,或者可以选择地图的竞技类游戏。
五、类页游做法,用到资源时下载
在我们国内,曾经有十几年的网页游戏辉煌的年代。很多游戏从业者都做过页游,包括阿赵我。在网页游戏的年代,根本就不会有包体容量的问题,只需要打开网页,就能进入游戏,游戏资源是一边玩一边下载的,比如一张地图,在没下载完之前,会先用一个低像素马赛克图来替代,等下载完地图之后,再变成清晰的大图。比如角色,在没下载完成之前,会先显示一个小黑人,等下载完成之后,再把小黑人替换成正确的角色模型。
这种做法的游戏很多,比如再前段时间出的《哈利波特》手游。
1、优点
可以几乎完全解决包体容量问题,在游戏首包里面只需要放登录界面和一些游戏通用界面元素就可以了。也不需要太在意游戏资源包的划分,因为不需要打游戏资源包了,基本上每个资源都是独立的,可以单独下载的。
然后由于缺少资源并不会影响游戏的进度,会有替代资源显示,所以玩家完全可以在资源没有下载完的情况下,一直进行游戏。
2、缺点
这种做法需要在游戏的低层做各种的异步加载,并且开线程去下载资源,然后做回调处理。所以实现难度是比以上列举的其他方案难度都要大的。
然后,由于每个资源出现的时候,都有可能出现替代资源,在网速不好的情况下,整体的游戏体验可能会受到一定的影响。我在玩《哈利波特》手游的时候,玩了一个多小时,可能是由于公司网络较差,我基本上没看到一个正常的模型,包括所有剧情,我都是看到一片漆黑的。所以在体验了一个多小时之后,我就放弃了。
六、在空闲时静默下载
由于以上所有方案,都避免不了需要额外下载资源,区别只是在什么时候下载。所以对于分章节下载、分地图下载,或者用到资源再下载的方案,其实剩下的部分资源,是可以在空闲的时候,就提早下载,不需要等到真的用到的时候才去下载,这样对于用户来说,体验会好很多。
不过这里提醒一句,如果是手机游戏,我们不能保证玩家一定是在WiFi的情况下进行下载,所以在下载之前,我个人认为,一定要给玩家提示,让玩家同意了之后,才可以进行各种的下载,不然偷偷跑了玩家几个G的流量,是比较不道德的问题。不道德的事情,有我阿赵做就行了,大家就不要做了。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: LeetCode 周赛 352(2023/07/02)一场关于子数组的专题周赛
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问。 往期回顾:LeetCode 单周赛第 350 场 · 滑动窗口与离散化模板题 单周赛 352 概览 T1. 最长奇偶子数组(E…