那些你与AssetBundle的爱与恨...

2024-02-09 22:38
文章标签 assetbundle 爱与恨

本文主要是介绍那些你与AssetBundle的爱与恨...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自侑虎科技UWA:

https://blog.uwa4d.com/archives/624.html

侑虎科技的技术贴子都很不错,建议大家去看看,创始人-张鑫 也是很牛的,斗鱼有开过公开课


Q1:Resource的场景下有两个场景Scene1.unity和Scene2.unity。我要对这些文件进行打包,生成了

Scene1.assetbundle 
Scene1.assetbundle.meta 
Scene2.assetbundle 
Scene2.assetbundle.meta

如果我有相同的资源,理论上它会在这两个包里各存一份,这样就造成了包体过大。所以有没有办法把共享资源做成依赖项单独打包,这样的话每个场景就不会过大了。Unity 5.x的BuildAssetBundles打包机制是否和Unity 4.x不一样?原来的打包机制已经被剔除了吗?

用Unity 4.x 的 Push/Pop 是可以抽出相同的资源,并且据我们所知该方法在Unity 5.x 中也受用。根据Unity 5.x新的打包机制,只要把相同资源的 AssetBundle Name 设置好,打包时就会自动抽出来。


Q2: 我们在使用Unity 4.3.4开发项目的过程中会遇到锁屏后主线程卡死的问题,因此我们考虑将Unity版本降至4.1.2,但是因为之前用Unity 4.3.4版本打包的资源比较多,所以想咨询下有没有方法可以用Unity 4.1.2 加载 Unity 4.3.4 打包出的AssetBundle?

Unity 4.x 系列中各个版本 AssetBundle 是不兼容的,高版本加载低版本也有可能出现问题,所以一旦版本改动(特别是跨了大版本的改动,如 Unity 4.3 到 Unity 4.5 或者Unity 4.5 到 Unity 4.6 等等)都是需要重新打包 AssetBundle 的。


Q3:如果先Destroy Prefab ,然后将Prefab中用到的AssetBundle再进行Unload,这样的顺序是否会有问题 ? 我在手机上测试时发现这样做内存中就会一直存在,不释放;如果反过来, 就可以释放。另外,我是在Destroy 的时候调用的Resources.UnloadUnusedAssets();,请问这会影响最终的结果吗?

确实可能发生这种情况,在 Resources.UnloadUnusedAssets(); 时,如果还没有进行AssetBunlde的Unload 操作,那么从AssetBunlde中加载的资源依然会因为被AssetBunlde引用而无法被卸载。 开发团队可以尝试 Destory 后做 AssetBunlde的Unload,最后进行 Resources.UnloadUnusedAssets(); 。


Q4: 我们将Shader放到了Resource的目录下,也已加到Editor的GraphicSetting里,也试过在加载一个空的Prefab时绑定对应的Shader。 但该Shader在Editor里无法正常显示,看运行时指向是有的,重新指一下就能显示了, 然而打包以后在手机上显示正常。

这确实是Unity已知的一个问题,Android 和 iOS 的部分Shader在打包后,在Editor 下无法正常显示。 主要原因是在打包时,只会把对应平台的Shader预编译代码(如 gles )打入包中,因此在 Editor 下会执行失败(通常 Editor 是 d3d 驱动)。 因此,目前只能尝试在Editor下重新指定Shader来绕过这个问题。


Q5: 我们在UWA上进行了性能测试,发现安卓上同步加载AssetBundle资源会非常耗CPU, 所以近期对资源加载方式做了比较大的调整,绝大部分的资源使用异步加载的形式。 不过这里有个疑问想咨询下: AssetBundle.LoadAsync 和 WWW加载方式都可以用来异步加载AssetBundle, 但是两者API特点也不同, 目前看WWW更耗内存一些, 请问这两种方式更建议使用哪一种 ?

AssetBundle.LoadAsync 是在获取了 AssetBundle 对象之后加载其中的资源的;而 WWW 加载是在获取 AssetBundle,两者的作用是不同的。
开发者可能是希望了解异步加载 AssetBundle 的几个 API 之间的区别,相关的接口如下:

new WWW 
WWW.LoadFromCacheOrDownload

这两种方式的具体区别可先参考《你应该知道的AssetBundle管理机制》中的“AssetBundle加载进阶”部分。


Q6: 现在生成AssetBundle的时候每个文件会多生成一个Manifest文件,这个文件也需要一起随着AssetBundle上传吗,在资源加载的时候具体怎么用呢?

每个文件多生成的Manifest 文件是不需要上传的,其作用就是供开发人员查看AssetBundle 中的依赖关系等信息。

但除了每个文件多生成的 Manifest 以外,根目录下还会有一个与根目录同名的AssetBundle 以及 Manifest 文件,通过运行时加载这个AssetBundle,可以得到一个 AssetBundleManifest 对象,然后就可以通过这个对象得到AssetBundle直接的依赖关系。

更多信息可以参考http://docs.unity3d.com/ScriptReference/AssetBundleManifest.html


这篇关于那些你与AssetBundle的爱与恨...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/695469

相关文章

Unity3D读取AssetBundle失败:The file can not be loaded

今天项目换了台新mini打iOS版本的ab包,真机上出现资源读取失败并有如下报错 The file can not be loaded because it was created for another build target that is not compatible with this platform. Please make sure to build AssetBundles

LuaFramework-打包AssetBundle工具

新建AddBuildMapUtility.cs using UnityEngine;using System.Collections.Generic;using UnityEditor;using System.IO;using System.Text;public enum SuffixEnum{Prefab,Png,Csv,Txt,}public class AddBuildMa

unity AssetBundle 使用_什么是AssetBundle_导入必要的插件_创建AssetBundles_AB包资源下载_大文件下载

一、什么是AssetBundle? 定义AssetBundle。 AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系;例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。为了提高通过网络传输的效率,可以根据

Unity AssetBundle分析工具

工具来源无幻大神的Unity AssetBundle 冗余检测与资源分析 https://github.com/akof1314/AssetBundleReporter 使用这个分析工具可以清晰得到项目中的ab包情况,相互依赖信息,检查出冗余,进行分析处理。

【Unity开发】避免重复加载场景资产AB(AssetBundle)包的优化

@[TOC](【Unity开发】避免重复加载场景资产AB(AssetBundle)包的优化) 项目需要远程加载场景AB包,并加载场景。 1、 初始方案 1.1 异步加载场景资产(获取AB包数据) public IEnumerator LoadAssetFromAB(string url, Action<AssetBundle> assetAB){yield return new Wait

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

unity使用AssetBundle使用记录一(再续)--AssetBundle Variant使用

使用的unity版本是5.3.5f。 之前的打包AssetBundle资源的文章中,并没有使用到AssetBundle的Variant参数。 Variant,主要用在不同版本资源的使用和动态替换AssetBundle。它被用来支持定制化的参数。与预定义宏类似,它可以对一个单独对象重映射项目中不同的资源。这样就可以灵活控制语言、地区、或者用户偏好。AssetBundle Variant相同的As

unity使用AssetBundle使用记录五)--AssetBundle内存管理

使用的unity版本是5.3.5f。 前面的文章说到了AssetBundle的打包、下载、存储、加载和卸载。这篇文章主要说说对AssetBundle内存的理解。 从服务器下载开始到卸载AssetBundle,一共经历了三个阶段,为了自己理解运用,自己做了一张图。 一、AssetBundle文件的下载和加载对内存的影响 unity在使用WWW方式时,会分配一系列内存来存放WWW实例(上

unity使用AssetBundle使用记录四--加载与卸载(2)

使用的unity版本是5.3.5f。 前一篇文章说到的加载是指的加载AssetBundle,这篇说的是从AssetBundle中加载Assets以及卸载AssetBundle。 当AssetBundle文件加载完成后,就可以将其中包含的Assets加载到内存了。 查到的接口有6个,如下: AssetBundle.LoadAsset(); --该接口可以通过名字将AssetBundle文

【Unity】AssetBundle打包策略

【Unity】AssetBundle打包策略 在游戏开发过程中,AssetBundle(AB)打包策略的重要性不容忽视。游戏开发者往往手动设置游戏资源包名进行管理,难免会造成资源确实或导致冗余,因此对于AB包的打包流程来说,进行策略管理显得十分重要。 采用打包策略管理整个AssetBundle打包流程,可以一键将你所需要的整个文件夹打成一个包、以及将特定文件夹下的每个资源单独打一个包,还会将这些