文档章节

unity 基于Assetbundle的更新机制的设计

liyong2
 liyong2
发布于 2015/09/30 00:33
字数 1606
阅读 306
收藏 0

客户端资源的管理是一个复杂的问题,这里描述一下我的一些实践:

####一:早期的cocos2dx项目中, 资源之间的依赖关系是写在代码里面的,资源的拼接组装都是通过代码进行的,因此游戏更新,主要通过两个途径,即代码更新和图片的更新;

cocos2dx 支持多个优先级的资源获取,即从高优先级目录或者位置首先搜索资源,没有的话再去低优先级位置搜索资源,这样sd卡上下载的新资源就会比apk中的旧资源优先加载,而只需要更新sd中资源即可;

我对所有资源做了一个md5值,客户端首先下载md5文件,和本地md5版本比较,找出新加的和更新的文件,挨个下载,最后再更新md5文件即可。

上述的方案存在问题: 1:资源之间的依赖关系被嵌入到代码中了,对应简单的2d游戏基本是图片拼接,依赖管理比较简单,可以这样处理 2:资源缺少整合打包机制,逐个下载和加载资源效率不高,不过2d游戏还是可以容忍的,好处就是资源管理简单,资源更新非常灵活

####二:unity中资源更新机制

1:unity中资源在编辑器中可以通过guid定位资源并且编辑资源的依赖关系,最后固化到prefab中;最后整个项目的资源就构成 多棵树木, 树木的root根节点都放在 Resource目录下,而树木的root所依赖的资源放到 Resources目录外即可。

unity中这种资源依赖关系,可以从Resource目录中资源开始分析,最后就可以得到所有的依赖关系。

2:unity 中可以将多个资源打成一个assetbundle,接着游戏通过块加载的方式提高加载速度;这里就存在一个严重的问题,即如何在内存使用和加载速度之间取得平衡呢?当内存不够加载所有的游戏资源怎么办? 如果内存可以放下所有的assetbundle,那么只需要全部加载即可,也就没有后面的问题了。

assetbundle对客户端来讲是静态资源集合,无法对资源进行拆分和重组织,因此其对应的游戏机制一般也是静态资源集合的方式,例如最常见的关卡场景模型,单种场景类型的资源是可以整合一起加载的。

当内存不足,则需要分类资源,对资源进行规划了。

资源分为公共资源和特殊使用资源,以及介于两者之间的资源,需要分别控制两种资源的规模。 其中公共资源需要为场景特殊资源预留足够的内存。

在假想的规划设计中,公共资源即常驻内存资源最多不超过规划内存总量的50%,而场景资源则占用剩余的40%。 接着是一些零散的碎片资源,这些资源的使用介于公共资源和场景独占资源之间,即有一定的跨场景使用能力,但这种能力应该要设计低于50%。

通过上面三种分类,接着设计如何分类assetbundle。

#####方案一:所有资源一个 assetbundle,需要设计游戏内容完全可内存承载。

#####方案二:最简单的分类方法,即每个单一资源对应一个assetbundle即类似于cocos2d中最灵活的方案。

#####方案三:多包机制,资源分类从来都不是个简单问题

高级方案则需要对资源分类,采取合适的整合方法:

如果构建合适的规则来对资源进行分类整合呢?

这里采用人工分类和实践自动分析结合的方式:

首先资源的Root 树结构分析可以找到最终的叶子资源;这些资源是无依赖资源,存在多种资源对其有需求,例如一个shader资源,可能有多个材质都需要使用;这种资源很有可能是属于公用资源的,例如其使用率高于50%即可认为是公用资源,例如UI资源。

其它一些叶子节点特殊属于某类场景,则从叶子节点向上都应该属于某个场景,类似的,只要我们确定某个节点特属于特定场景,则该节点所有父亲节点也特属于某个场景。则根据场景打包。

相反的我们有,若某个节点多场景使用,则其所有孩子节点也是多场景使用节点。

####三:游戏资源的更新 对应于上面分的3类: 其中Common资源会添加,但是更新频率应该要控制较低,COmmon中UI类又属于高频度更新,应该尽量控制使用现有资源制作新的UI,而不是添加新的资源。shader资源也属于公用性资源,特殊针对某个模型的shader除外。

而场景独占资源是对游戏内容的扩充,频繁更新;

跨场景资源,流动性中等,推荐采用单资源单assetbundle模式,例如新的职业角色,新的怪物等。

####四:后期如何调整资源分类,如何更新资源 资源分类应该有一种自适应的方案来进行,随着游戏发展而逐渐调整; 我们添加一个资源到树中,根据资源所处的父亲和孩子节点,得出资源倾向于和父亲属于同一个包便于一起加载,否则需要加载两个包,若父亲包过大 则资源倾向于和所有父亲包中资源的孩子构成的兄弟构成一个新包; 若孩子包过大,则资源可以独立成包。 这种结构保证了不会发生沉降现象,即父亲包 沉入孩子组中。

####五:所有问题的关键还是 公共资源规模控制; 场景特殊资源规模控制; 游动资源规模控制

© 著作权归作者所有

liyong2

liyong2

粉丝 51
博文 196
码字总数 64732
作品 0
广州
程序员
私信 提问
Unity网络交互丨AssetBundle(二):如何下载、加载与卸载AssetBundle

版权声明:欢迎转载,转载请注明出处 https://blog.csdn.net/weixin_38239050/article/details/87658949 一、下载AssetBundle Unity提供了两种方式从服务器下载AssetBundle文件: 1、非缓存机...

橙子va
02/19
0
0
刘国柱- Unity游戏开发深度学习 系列课程福利大放送

刘国柱--Unity游戏开发深度学习 系列课程福利大发送!不单优惠, 还送Unity最新版本必备实战书籍! HI, 各位热心的Unity爱好者与学员,《Unity3D/2D 游戏开发从0到1(第二版)》书籍已经正式发...

Liu_guozhu
2018/05/23
0
0
unity3d的资源管理和热更新方案

之前开发一直使用cocos2dx,最近开始搭建unity3d的框架,遇到的一个大问题就是热更新。虽然代码采用了slua脚本,unity3d官方也提供了assetbundle这样的解决方案,但是还是有好多的问题需要解...

球球闪电
2018/06/29
0
0
Unity3D占用内存太大的解决方法【先转,慢慢看】

Unity3D占用内存太大的解决方法 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.L...

小姚
2014/09/01
2.5K
0
【转】Unity资源管理原理知识(干货不嫌长)

最近unity 当需要频繁创建一个物体对象时,怎样减少内存. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两...

小姚
2015/02/25
4K
1

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部