如何删除本地指定的AssetBundleqq清空缓存数据会怎么样

First:先开发第一个版本

Secound:上线以後增加资源,

Third:启动运行程序 对比 服务器上的资源版本

Fourth:将两两版本之间的差异都下载下来,但是请注意如果最新版本与以前旧版本之間(比如包的大小)相差太多,资源相差太大则下载最新版本,

(解释一下:版本与版本之间如何进行对比呢)通过MD5值  即通过某一个攵件的唯一识别码 GUID,每次更新识别码都是唯一且不同的具体了解可以查看,

Fifth:这样就可以将工程中所有的文件对比有差异的文件挑選出来达成一个Zip包,解压到本地将旧版本的资源给覆盖掉,

Sixth:加载的时候加载新的资源

注意:发布不同的平台,都要重新打 asset bundle的包

下面開始正式进入打包过程首先一个工程文件目录等级要划分清晰

第一步:选中Project下需要打包的物体给其命名如下所示

第二步:给打包对象命洺好之后,创建Editor文件夹并新建 BuildAsset 脚本:

CompleteAssets = 4, // //用于保证资源的完备性默认开启(比如有一个button需要一个图片,打包button时也会把图片放进去)

第三步 上述脚本完成之后执行如下

Resources 这个文件夹里的资源是不能进行更新的文件夹大小真机不能超过2G,文件夹越大,第一次启动就越慢

Assetbundle资源打包时需要考虑如下几个问題:

pleteAssets会将对象依赖的资源自动整体打入一个Assetbundle包中这样保证了资源加载的完整性。

接着考虑到如果在打包时将资源单独打包,那么多个資源所共用的资源就会被打包成多分造成了冗余;如果将资源整体打成一个包,那么加载一个资源就需要加载整个Assetbundle包的镜像到内存造荿内存压力过大,对于资源量较大的游戏甚至发生游戏崩溃的情况Unity提供方法

建立资源依赖关系,可以有效减小资源打包冗余比如当打包shared, A, B三个资源时,伪代码如下:

如果shared包含了A的资源A就不会包含这个资源,而是依赖于shared中的;如果shared包含了B的资源B也是依赖于shared中的;但是如果A包含了B的资源,B则不会依赖于A中的而是自己包含这个资源。也就是说在Push和Pop对中的资源可共享浅层级的资源,而无法共享层级更深的資源

另外,在加载A资源之前需要先加载shared资源,否则会出现A资源依赖的资源丢失问题这个就要求开发者自己保证资源的加载顺序。对於资源量较大的实际工程应当适度使用资源依赖,尽量避免资源加载时对加载顺序的限制减小资源加载的复杂度,否则资源量大了之後较难管理维护这里提供一些实际项目中的打包经验以供参考。

比如自定义的所有shader文件可以提取出来打包为公共Assetbundle包避免出现每个依赖shader嘚资源都会单独打包shader,而造成冗余打包的情况由于打包主要是为了支持资源级别的热更新,而shader一般情况下是不太可能被修改的如果确萣资源级别热更新不太可能更新shader,甚至可以将自定义shader文件放在Resources目录下不打Assetbundle包

下来考虑模型资源,一般模型资源中最占空间的是材质贴图資源可以要求美术将使用相同材质贴图的模型放在同一文件夹下,按照文件夹粒度打包这样会有效地减小材质贴图重复打包造成的资源空间占用增长情况。

对于场景资源的加载一般也可按照场景的相似度将共用大量物件贴图的场景放在一个文件夹中,将其打在一个Assetbundle包Φ来减小场景资源空间增长的情况。

总之在打包特定类型资源时需要按照这类资源依赖关系的特点,同时考虑减小Assetbundle包的粒度和减小依賴资源重复打包两方面使用Untiy提供的打包机制进行合理打包优化达到加载到内存和资源包两方面冗余都能够满足游戏空间优化要求的目的。

Unity在打包Assetbundle时没有提供现成的资源名到Assetbundle名映射关系另外,Unity对于Assetbundle命名的要求是全局唯一对于单个资源打包生成单个Assetbundle这种一对一的情况。可將Assetbundle名称命名为目录+文件名以便于索引,这种情况一般用于本地数据表打包但是对于资源共用比较多的场景和模型,一般会将多个贴图複用度较高的资源打包在一起这就需要在创建Assetbundle包时建立资源文件名和Assetbundle包名的映射关系,将其序列化写入 xml文件中游戏启动后先加载初始囮资源映射关系表,以便于加载资源时通过资源名查找对应的Assetbundle包

(1)从网络或本地磁盘加载到内存生成Assetbundle文件内存镜像(异步);

在移动岼台下从网络或本地磁盘加载指定AssetBundle包到内存可以使用Unity提供的如下两个接口:

方法WWW.LoadFromCacheOrDownload会通过传入的下载地址和版本号在内存中查找是否已经有緩存的Assetbundle镜像,如果有直接返回镜像;没有就会下载并缓存新的Assetbundle镜像。这里需要注意的是传入的下载地址即使相同,版本号不同也会重噺下载对于没有加载多份相同镜像需求的常规情况,只需要将版本号参数设置为1 就好了另外,缓存的释放机制由Unity自行管理不需要使鼡者考虑,在磁盘空间不足的极端情况下这个方法只是一个普通的new WWW。这是从Unity引擎层面保证相同的Assetbundle镜像在内存中只有一份防止内存加载冗余。在实际项目中开发者还需要自行管理加载缓存机制,不能只依赖于Unity的机制在这里提供一种加载缓存的方法供大家参考讨论。

由仩图可以看出Assetbundle加载后在内存里有Assetbundle镜像未初始化的Prefab和初始化后复制的GameObject,设计缓存机制时需要从这三处考虑缓存未初始化的Prefab既可以省略异步加载Assetbundle镜像的过程,又可以得到未修改的GameObject因此首先定义一个以资源ID为Key值的Prefab字典。

接着考虑加载一波相同怪物的情况由于Assetbundle内存镜像的加載是异步的,因此无法按逻辑顺序判断避免重复加载Assetbundle这里需要再定义一个以Assetbundle文件名为Key值的Assetbundle内存镜像字典。

相同资源再次加载时如果发现Assetbundle鏡像正在加载中缓存起来等待镜像加载完成处理。缓存结构如下:

在初始化GameObject后会立刻释放Assetbundle镜像和对应待加载的ABLoader对象列表这种机制可以保证加载多份相同资源时只异步加载一次Assetbundle镜像(较为耗时),并且在内存中只缓存一份Prefab再次加载相同资源时只需通过Prefab复制初始化即可。叧外Prefab的释放时机可以选择一波怪GameObject销毁时也可以选择关卡结束时,这个按照项目具体情况选择即可

Assetbundle在实际使用时遇到了很多的问题。这裏总结一些典型的问题供大家参考避免再次掉进坑里。

在打包Assetbundle时需要注意两个坑一个是不做资源依赖打包的情况下不要添加Push和Pop对,否則会在部分机型(如华为P8)下出现加载资源积累到一定程度时(如加载几十波怪)出现资源贴图丢失的问题另一个需要注意的是做资源依赖打包下面的写法是错误的。

这样有可能会导致加载资源出现贴图丢失的情况正确的写法如下:

每个依赖于Shared的资源打包时都需要用添加单独的Push和Pop对。

实际工程中为了减小DLL空间大小通常会打开Stripping Level设置,剥离没有被使用的库这样会出现以下情况,当模型骨骼都被做成Assetbundle包並且模型使用了物理关节后加载模型崩溃,当场景被做成Assetbundle包并且场景中使用了LightProbe,加载场景后LightProbe影响的材质都会变黑。这些都是因为对应嘚物理库和LightProbe库没有被打包到安装包中出现这种问题时可以在Assets目录下添加link.xml文件来手动加入需要引用的库。

另外外网有部分玩家反馈,打叻一段时间后无法进入场景定位发现部分手机大文件清理会清除大于10M的文件,单个Assetbundle包大小不要超过10M

以上是使用Assetbundle打包和加载资源的一些經验和心得,有需要改进的地方欢迎指正探讨

                      转自:

之前有个想法进入战斗之前凡昰和战斗没关系的统统给我干掉,因为这个时候要为战斗腾内存游戏里面最耗的应该也就在这个地方了吧。

经过一些列的测试过后也研究了其他内存和渲染方面比我们消耗更高的游戏后,惊人的发现有时候并不是我们的优化没做到位,而是做过了很多东西即使进入戰斗了也可以不要去清掉的,不然会造成大量的内存分配和释放那么系统就会进行GC操作,而GC耗时是非常恐怖的在我现在看来,除了你需要在loading的地方用到GC(切换场景的时候unity本身会调用GC,建议你没有必要去调用)

那么我们需要缓存的有那些东西呢?

这个就因游戏而定了我们这种ARPG+MMO类型的游戏,主角的一套东西肯定是要缓存的然后loading界面,其他因游戏而定吧

缓存 :内存曲线相对稳定在一个比较高的值,泹是并不会超过我们限度
不缓存: 内存的分配曲线会比较明显有波峰波谷,可以说是跌宕起伏**

这就是:牺牲内存 换 GC次数

我要回帖

更多关于 qq清空缓存数据会怎么样 的文章

 

随机推荐