博客
关于我
Unity3D 资源加载(Resources和AssetBundle)和内存管理
阅读量:502 次
发布时间:2019-03-07

本文共 1955 字,大约阅读时间需要 6 分钟。

Unity3D 中的 AssetBundle 和 Resources 动态加载机制

在 Unity3D 开发过程中,AssetBundle 和 Resources 是两种常用的动态加载机制,它们在资源加载与管理中各具特点。以下从基本原理到使用实例,详细解析这两种机制的异同。

一、Resource – 动态内部加载

Resource 是一种动态内部加载的方式,主要用于编辑时的资源管理。在 Project 窗口中,Resource 类通过 Resources.Load 方法获取资源。其特点为:

  • 内部调用:资源加载是在程序内部完成的。
  • 编辑环境下可用:在编译时,资源文件夹会被压缩处理,变成 Assets 资源文件。
  • 可打包处理:在最终构建时,资源文件夹会被转换成内存镜像数据块。

使用资源加载的优点是内部资源管理简单,适用于需要自定义加载路径的场景。

二、AssetBundle – 动态外部加载

AssetBundle 是动态外部加载的方式,适用于需要在运行时加载资源的场景。其特点为:

  • 外部文件操作:需要将资源打包成 .assetbundle 文件,通常存储在本地或网络服务器中。
  • 灵活加载方式:支持从文件、缓存或网络加载资源。
  • 运行时适用性强:适合在运行时加载大量或频繁更换的资源。

相比 Resource,AssetBundle 的优势在于更高的灵活性和对外扩展性,但其文件管理稍显复杂。

三、AssetBundle 运行时加载方式

AssetBundle 提供了多种加载方法,主要通过以下 API 调用:

  • LoadFromMemory(byte[]):从内存加载资源镜像。
  • LoadFromMemoryAsync(byte[]):从内存异步加载资源镜像。
  • LoadFromFile(string):从文件系统加载资源文件。
  • LoadFromFileAsync(string):从文件系统异步加载资源文件。
  • WWW.LoadFromCacheOrDownload(string, int):从缓存或网络下载资源。
  • UnityWebRequest.Get(string):通过 WWW 请求获取资源文件。

需要注意的是,加载完成后会得到 AssetBundle 的内存镜像数据块,而 Asset 并没有单独的概念。只有通过特定 API 才能将镜像转换为 Asset 对象。

四、Asset 发生机制

在加载 Asset 的过程中,除了复制活性单元(例如 GameObject)的实例外,还会包含以下资源类型的引用复制:

  • Gameobject:复制。
  • Transform:复制。
  • Mesh、Texture、Material、Shader:引用复制。
  • Script:新实例化。

复制后,Script 类实例会被挂在 Unity 主线程上执行。

五、AssetBundle 释放机制

为了优化内存使用,AssetBundle 提供两个 Unload 方法:

  • AssetBundle.Unload(false):释放 AssetBundle 文件的内存镜像,不影响已加载的 Asset 对象。
  • AssetBundle.Unload(true):释放镜像文件和所有加载的 Asset 内存对象。

这种方式沿袭于 .NET 框架,适合需要动态管理资源容量的场景。

六、内存管理建议

在实际开发中,建议根据需求进行以下操作:

  • 加载时

    • 创建 AssetBundle 并加载所需资源。
    • 及时调用 AssetBundle.Unload(false),释放镜像文件。
  • 释放时

    • 使用 Destroy �angement 销毁不再需要的克隆对象。
    • 调用 Resources.UnloadUnusedAssets 消除未引用的 Asset。
    • 在不需要时调用 GC.Collect()。
  • 这种方式可以确保内存占用最低,同时避免内存泄漏风险。

    七、总结加载与初始化

    在使用 AssetBundle 加载资源时,需注意以下几点:

    • AssetBundle.LoadFromFile 是常用方法。
    • WWW.AssetBundle 类也可用于动态加载。
    • AssetBundle.Load(name) 可重复调用,但返回的物件单例处理。
    • Resources.Load 与之功能相似,但路径固定。

    八、脚本加载与复制

    对脚本资源访问,建议使用 Instantiate 方法。克隆脚本会生成实例,但保持引用属性。在多个物体共享同一个脚本时,将生成多个实例执行代码。

    九、优化与 GC 管理

    从性能优化角度,建议:

    • 及时销毁不需要的对象
    • 定期调用资源清理
    • 谨慎使用 GC.Collect

    通过规范的加载与释放机制,可以显著提升游戏性能表现。

    转载地址:http://vtdjz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现haversine distance斜距算法(附完整源码)
    查看>>
    Objective-C实现heap sort堆排序算法(附完整源码)
    查看>>
    Objective-C实现heaps algorithm堆算法(附完整源码)
    查看>>
    Objective-C实现heap堆算法(附完整源码)
    查看>>
    Objective-C实现Heap堆算法(附完整源码)
    查看>>
    Objective-C实现hexagonal numbers六边形数算法(附完整源码)
    查看>>
    Objective-C实现hidden layers neural network浅层神经网络算法(附完整源码)
    查看>>
    Objective-C实现highest response ratio next高响应比优先调度算法(附完整源码)
    查看>>
    Objective-C实现hill climbing爬山法用来寻找函数的最大值算法(附完整源码)
    查看>>
    Objective-C实现Hill密码加解密算法(附完整源码)
    查看>>
    Objective-C实现histogram stretch直方图拉伸算法(附完整源码)
    查看>>
    Objective-C实现Hopcroft算法(附完整源码)
    查看>>
    Objective-C实现horizontal projectile motion平抛运动算法(附完整源码)
    查看>>
    Objective-C实现hornerMethod霍纳法算法(附完整源码)
    查看>>
    Objective-C实现Horn–Schunck光流算法(附完整源码)
    查看>>
    Objective-C实现Http Post请求(附完整源码)
    查看>>
    Objective-C实现http下载文件 (附完整源码)
    查看>>
    Objective-C实现Http协议下载文件(附完整源码)
    查看>>
    Objective-C实现huffman哈夫曼编码算法(附完整源码)
    查看>>
    Objective-C实现ID3贪心算法(附完整源码)
    查看>>