博客
关于我
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/

    你可能感兴趣的文章
    OpenCV中遇到Microsoft C++ 异常 cv::Exception
    查看>>
    opencv之cv2.findContours和drawContours(python)
    查看>>
    opencv之namedWindow,imshow出现两个窗口
    查看>>
    opencv之模糊处理
    查看>>
    Opencv介绍及opencv3.0在 vs2010上的配置
    查看>>
    OpenCV使用霍夫变换检测图像中的形状
    查看>>
    opencv保存图片路径包含中文乱码解决方案
    查看>>
    OpenCV保证输入图像为三通道
    查看>>
    OpenCV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    opencv图像分割2-GMM
    查看>>
    opencv图像分割3-分水岭方法
    查看>>
    opencv图像切割1-KMeans方法
    查看>>
    OpenCV图像处理篇之阈值操作函数
    查看>>
    opencv图像特征融合-seamlessClone
    查看>>
    OpenCV图像的深浅拷贝
    查看>>
    OpenCV在Google Colboratory中不起作用
    查看>>
    OpenCV学习(13) 细化算法(1)(转)
    查看>>
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    查看>>
    OpenCV学堂 | CV开发者必须懂的9种距离度量方法,内含欧氏距离、切比雪夫距离等(建议收藏)
    查看>>
    OpenCV学堂 | OpenCV中支持的人脸检测方法整理与汇总
    查看>>