本文主要是介绍Assetbundle相关问题及使用优化技巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
摘录自侑虎科技
侑虎科技的技术贴子都很不错,建议大家去看看,创始人-张鑫 也是很牛的,斗鱼有开过公开课
资源管理
Q1:打包AssetBundle的时候,我发现切换场景时,即使打同一个场景的AssetBundle,它们的Hash值都是不一样的,可能是什么原因造成的呢?
在不同的场景下打包同一个资源或场景时,如果出现AssetBundle的差异,目前很可能是Shader Stripping造成的,其原理可见文档:https://docs.unity3d.com/Manual/class-GraphicsSettings.html
简单来说就是根据当前场景对Shader进行简化,因此如果打包时包含的场景的Lightmap或Fog设置不同,打出来的AssetBundle包也有可能是不同的。可以尝试通过把Graphics Settings中的Shader Stripping设置进行修改来避免这个问题。
资源管理
Q2:当UI关闭后,Texture图片却还留在内存,是下次垃圾回收或者Resources.UnloadUnusedAssets调用的时候就会清除吗?如果想立即清除,该如何操作?
垃圾回收并不会卸载内存中的资源,而Resources.UnloadUnusedAssets是可以的,但前提是纹理资源已经不再被其他Object引用。如果要立即清除,可以尝试直接调用Resources.UnloadAsset来进行卸载。
资源管理
Q:我有一个关于AssetBundle资源加密问题。CreateFromMemory这里不推荐大规模使用,那是不是我们要放弃对一部分资源的加密?还是说有其它的解决办法?
由于CreateFromMemory的加载速度相较其他的接口而言,耗时明显增大,因此我们确实不建议大规模使用。就目前而言,除了使用CreateFromMemory,并没有其他高效直接的方法进行资源加密,因此,确实需要放弃对一部分资源的加密。同时,目前存在一些工具可以从更底层的方式来获取和导出渲染相关的资源,如纹理、网格等,因此,对于这部分的资源加密并没有十分的必要性。
Q:我想确认一下Shader的依赖打包问题。如果采用了依赖打包,A、B、C依赖了D,当我更新了D包时,A、B、C是否都要重新打包?反过来呢?
在使用Unity 4.x的接口时开启DeterministicAssetBundle,或者使用Unity 5.x新接口(默认强制开启DeterministicAssetBundle)时,当更新了D包,都是不需要重新打包A、B和C的。
反之,如果更新了(比如B包),那么在Unity 4.x 下依然是需要重新打D包的,而Unity 5.x新接口则会检测到D包未更新,而自动跳过其打包过程。
这篇关于Assetbundle相关问题及使用优化技巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!