Unity资源加载与释放

参考资源

http://www.cnblogs.com/freebird92/archive/2013/03/12/2955888.html
http://www.taidous.com/bbs/article-445-1.html

AssetBundle 与 Resources的区别

Resources相当于Unity一个缺省的AssetBundle。
AssetBundle可以在使用时动态加载。
Resources.load();在没有第一次Instantiate之前没有完全加载Asset资源。所以相对AssetBundle去实例一个资源,Resources会在第一次Instantiate时出现卡顿现象。

AssetBundle 加载与释放

AssetBundle的加载方式有:AssetBundle.LoadFromFile(“”); AssetBundle.LoadFromMemorty(byte[]);及WWW方式。
AssetBunddle.LoadFromFile(“”);只有在standalone上可以使用。WWW在加载AssetBundle时,会在内部创建assetBundle实例。
当AssetBundle被加载到内存后,其实内存中只有AssetBundle文件的镜像内存。//todo 该镜像文件是AssetBundle原文件大小?
当需要具体某个Prefab等资源时,使用assetbundle.Load(“”);加载具体资源。此时内存中会存在此资源的 GameObject、shaders、材质、贴图等内存。当具体Instantiate一个资源时,会对此资源的Asset资源进行clone+引用操作。Clone的资源包括GameObject、Tranform。引用的资源包括Texture、TerrainData、Shader。引用与Clone同时存在的包括 Mesh、material、PhysicMaterial、noxss。引用的资源只是指针的指向。Clone的会重新生成新的内存。
根据AssetBundle资源的加载方式,当资源释放时,如果只是Destroy,只会释放生成这个资源时Clone的那部分内存。assetBundle.Load(“”);加载的Asset内存没有被释放,AssetBundle的镜像内存也没有被释放。所以如果在该资源被销毁时需要使用Resources.UnloadUnuseAssets();去释放没有被使用的Asset资源内存。如果该AssetBundle不会被再使用可以使用AssetBundle.Unload(true)销毁内存。AssetBundle(true);代表销毁该AssetBundle镜像内存及所加载的Asset内存。参数为false时,代表只销毁镜像内存。
下面的图片可以更形象的理解AssetBundle的加载与释放。

备注

当场景在切换时,Unity 会自动 把托管的内存释放,这其中包括Asset内存、Instantiate内存。但不会被释放的是AssetBundle镜像内存。
assetBundle.Load如果多次加载相同的资源,除第一次,其它都会返回第一次的对象。
### Unity 中的资源加载方法 在Unity3D开发过程中,为了优化游戏性能、减少内存占用并提升用户体验,合理规划资源加载卸载至关重要[^2]。以下是几种常见的资源加载方式: #### 使用 `Resources` 文件夹加载资源 这是最简单的方式之一,在项目中创建名为 `Resources` 的特殊文件夹,并将需要动态加载资源放置其中。通过调用静态类 `Resources.Load<T>(string path)` 方法来获取指定路径下的对象实例。 然而这种方式存在局限性,比如无法精确控制何释放不再使用的资产;另外当工程规模较大容易造成不必要的膨胀,因此建议谨慎采用此法作为主要手段[^4]。 ```csharp // 加载纹理 Texture2D texture = Resources.Load<Texture2D>("Textures/my_texture"); ``` #### 利用 AssetBundle 进行打包管理 对于大型项目而言更推荐的做法是构建自定义的AssetBundles来进行分组式的资源整合[^1]。这不仅有助于按需下载特定场景所需的数据集合,而且能够有效降低初次启动间以及整体安装包大小。 具体操作上先要在编辑器端完成打包流程,之后运行期间可通过网络请求或者本地存储读取对应名称前缀匹配的目标bundle文件,再利用其提供的接口如 `LoadAsset()` 或者泛型版本的方法取得内部含有的任意类型实体[^3]。 ```csharp using UnityEngine; using System.Collections; public class Example : MonoBehaviour { IEnumerator Start () { using (WWW www = new WWW("file://path_to_your_bundle")) { yield return www; } AssetBundle bundle = www.assetBundle; GameObject prefab = bundle.LoadAsset<GameObject>("prefab_name").Instantiate(); } } ``` #### 借助 Addressables 实现现代化解决方案 Addressable Assets 是官方推出的新一代资产管理工具集,旨在解决传统模式下遇到的各种痛点问题。它允许开发者以更加灵活高效的方式来组织处理各种类型的素材,支持异步预加载、缓存策略配置等功能特性。 借助于这套框架可以轻松实现跨平台兼容性的部署方案,同也简化了多语言适配和支持热更新等复杂业务逻辑的设计难度。 ```csharp await Addressables.InstantiateAsync("address_key_here"); ``` ### 最佳实践总结 - **评估需求**:根据项目的实际情况权衡不同加载机制之间的优劣之处; - **测试验证**:确保所选途径能够在目标设备上稳定工作且满足预期效果; - **持续迭代改进**:随着产品演进不断调整和完善现有的资源配置计划。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值