简述Unity的资源加载和内存管理

Unity资源管理(AssetBundle加载和卸载)及内存管理(内存的申请和释放) Instantiate的过程是一个对Assets进行Clone(复制)和引用相结合的过程,Clone的过程需要申请内存存放自己的数据,而引用的过程只需要直接一个简单的指针指向一个已经Load的资源即可。另外需要注意,系统在加载新场景时,所有的内存对象都会被自动销毁,这包括了Resources.Load加载的Assets, 静态绑定的Assets,AssetBundle.Load加载的资源和Instantiate实例化的对象。释放AssetBundle文件本身的内存镜像,但不销毁加载的Asset对象。 阅读详情

Unity的资源加载和内存管理是游戏开发中的核心环节,合理管理资源能够提升游戏性能、降低内存占用,并确保流畅的游戏体验。以下是对Unity资源加载和内存管理的简略解释,涵盖了资源加载的方式、内存管理机制、常见问题及优化建议。


资源加载方式

Unity提供了多种资源加载方式,每种方式适用于不同的场景和需求。了解这些方式的优缺点,可以帮助开发者选择最适合项目的方案。

Resources加载

  • 描述:Resources文件夹是最基础的资源加载方式。所有放入Resources文件夹中的资源会在构建时打包进游戏包体中。
  • 加载方式:通过Resources.Load()方法加载资源,例如:
  • GameObject prefab = Resources.Load<GameObject>("Prefabs/MyPrefab");
  • 优点:
    • 简单易用,适合小型项目或快速原型开发。
    • 加载速度快,因为资源已经打包在游戏包体中。
  • 缺点:
    • 资源无法动态更新,必须随游戏包体一起发布。
    • 所有资源在启动时都会占用内存,容易导致内存浪费。
  • 适用场景:小型项目、快速原型开发,或不需要动态更新的资源。

AssetBundle加载

  • 描述:AssetBundle是Unity提供的一种资源打包和加载机制,允许将资源打包成单独的包文件,并在运行时动态加载和卸载。
  • 加载方式:通过AssetBundle.LoadFromFile()等方法加载AssetBundle,再从中加载具体资源,例如:
  • AssetBundle bundle = AssetBundle.LoadFromFile("path/to/bundle");
    GameObject prefab = bundle.LoadAsset<GameObject>("MyPrefab");
  • 优点:
    • 支持动态加载和卸载资源,适合需要热更新的项目。
    • 支持版本控制和增量更新,减少下载量。
    • 可以按需打包资源,优化资源管理。
  • 缺点:
    • 管理复杂,需要手动处理资源的打包、加载和卸载。
    • 需要处理资源之间的依赖关系。
  • 适用场景:中大型项目,特别是需要热更新和动态加载资源的功能性游戏。

Addressable Asset System加载

  • 描述:Addressable Asset System是Unity官方推荐的资源管理方案,建立在AssetBundle的基础上,提供了更高级的API和功能。
  • 加载方式:通过Addressables.LoadAssetAsync()等方法加载资源,例如:
  • Addressables.LoadAssetAsync<GameObject>("MyPrefab").Completed += handle => 
    {
        GameObject prefab = handle.Result;
    };
  • 优点:
    • 简化资源管理,自动处理AssetBundle的打包和加载。
    • 支持异步加载、资源依赖管理、自动卸载等功能。
    • 提供可视化界面,便于资源管理和调试。
  • 缺点:
    • 学习曲线较高,适合有一定经验的开发者。
    • 在某些复杂场景下,可能需要手动优化。
  • 适用场景:中大型项目,特别是需要高级资源管理和热更新功能的项目。

内存管理机制

Unity的内存管理主要依赖于引用计数机制和垃圾回收(GC)系统。理解这些机制有助于开发者合理管理资源,避免内存泄漏和性能问题。

引用计数

  • 描述:Unity中的资源对象(如纹理、模型、音频等)都使用引用计数来管理其生命周期。当一个资源被加载时,其引用计数加1;当资源不再被使用时,引用计数减1。
  • 卸载机制:当资源的引用计数降为0时,Unity会在合适的时机(如场景切换时)自动卸载该资源。
  • 手动卸载:开发者可以通过Resources.UnloadUnusedAssets()手动触发卸载所有引用计数为0的资源,例如:
  • Resources.UnloadUnusedAssets();
  • 注意事项:资源卸载不是即时的,Unity会选择合适的时机执行卸载操作。

垃圾回收(GC)

  • 描述:Unity使用Mono运行时,Mono的垃圾回收器会定期回收不再使用的托管对象(C#对象)。
  • 注意事项:GC的触发时机不确定,频繁的GC会导致游戏卡顿。
  • 优化建议:
    • 避免在Update等高频方法中创建大量临时对象。
    • 使用对象池复用对象,减少GC压力。

常见问题及优化建议

在实际开发中,资源加载和内存管理容易出现一些问题。以下是常见问题及相应的优化建议。

重复加载资源

  • 问题:重复加载同一个资源会导致内存中存在多个副本,浪费内存。
  • 优化建议:
    • 使用资源缓存机制,将常用资源缓存在内存中,例如:
  • Dictionary<string, GameObject> cache = new Dictionary<string, GameObject>();
    if (!cache.ContainsKey("MyPrefab"))
        cache["MyPrefab"] = Resources.Load<GameObject>("MyPrefab");
  • 在加载资源前,检查是否已经加载过该资源。

资源未及时卸载

  • 问题:不再使用的资源未及时卸载,导致内存占用过高。
  • 优化建议:
    • 在资源不再使用时,及时将引用置为null,例如:
    • GameObject prefab = Resources.Load<GameObject>("MyPrefab");
      prefab = null; // 释放引用
    • 定期调用Resources.UnloadUnusedAssets()。

    • 使用Addressable的Addressables.Release()卸载资源。

资源依赖管理

  • 问题:AssetBundle中的资源可能存在依赖关系,卸载时需要注意依赖资源的引用。
  • 优化建议:
    • 使用Addressable Asset System自动管理依赖关系。
    • 在卸载AssetBundle前,确保所有依赖资源都已卸载。

内存监控

  • 问题:内存使用情况不透明,难以发现和定位内存问题。
  • 优化建议:
    • 使用Unity Profiler监控内存使用情况,分析内存占用和GC情况。
    • 定期进行内存快照,检查资源加载和卸载情况。

建议

为了确保资源加载和内存管理的高效和可靠,建议在项目中建立一套完善的资源管理流程和规范。

资源打包策略

  • 将常用资源打包进游戏包体,减少运行时加载。
  • 将可动态更新的资源打包成AssetBundle或使用Addressable。
  • 按功能模块或场景打包资源,减少单个包文件的大小。

资源加载策略

  • 使用异步加载方式,避免阻塞主线程,例如Addressables.LoadAssetAsync()。
  • 对于大型资源,考虑分段加载或流式加载。
  • 优先加载高优先级的资源,延迟加载低优先级的资源。

资源卸载策略

  • 在场景切换时,调用Resources.UnloadUnusedAssets()。
  • 对于Addressable,使用Addressables.Release()卸载资源。
  • 定期检查并卸载不再使用的资源。

资源缓存策略

  • 对于常用的小型资源,缓存在内存中,避免频繁加载。
  • 使用对象池管理UI元素、特效等可复用的资源。
Unity资源加载全解析:从Resources到Addressables的5种核心方案 在游戏开发中,资源加载是连接内容与运行时的关键技术,其核心原理在于高效管理内存与IO操作,以平衡性能与用户体验。从基础的同步加载到复杂的异步调度,资源加载技术直接影响着应用的启动速度、运行流畅度和内存占用。在Unity引擎中,开发者面临多种资源管理方案的选择,每种方案都针对不同的工程需求:Resources.Load适合原型快速验证,AssetBundle提供了精细化的分包与热更新能力,而Addressable Asset System则代表了现代资源管理的综合解决方案,通过统一的寻址接口和自动化的依赖管理 阅读详情

相关推荐

Vue2项目实战:海康威视WEB无插件开发包V3.4从下载到多画面预览(附完整代码)

本文详细介绍了在Vue2项目中集成海康威视WEB无插件开发包V3.4实现多画面监控预览的完整实战方案。内容涵盖从开发包下载、Nginx代理配置、核心组件封装到多画面并发加载与性能优化的全流程,并提供了完整的代码示例,帮助开发者高效解决浏览器无插件播放与多路视频流加载的难题。

c7d8e9的博客 320

Unity动态加载资源的几种方式

Unity资源加载的几种方式: instantiate:最简单的一种方式,以实例化的方式动态生成一个物体。 Assetsbundle:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object,unity官方推荐也是绝大多数商业化项目使用的一种方式。 AssetDatabase.loadasset :这种方式...

Abel02的博客 6775

Python OpenCV基于颜色通道分离法去除图片中的红色印章

最近一段时间的工作都是研究如何去除图片中的红色印章,在网上查找了大量的大佬写过的方法,发现大多数是采取颜色通道分离法来做,并且效果还不错。站在前人的肩膀上,我又做了些许调整,谈不上是改进,但是能应对更对的情况总还是好的,特此记录。 拿发票做例子,印章相较于其它部分最大的不同就是印章是红色的,而其它部分不是(这是一句废话)。 那么第一步当然就是将红色分离出来,这一步可以采用Python第三方库OpenCV里的 cv2.split()方法,该方法是把RGB图像的三个通道拆分开来,得...

wl_Honest的博客 1万+

Unity实现动态资源加载的4种方式

为了熟悉一下资源加载的API,做了一个加载图片的小demo,实现了4种加载图片方式,并且把同步与异步做了区分。 使用unity开发游戏的过程中,资源的加载一直都是需要重点关注的。unity一共提供了5种资源加载的方式,分别是Resources(只能加载Resources目录中的资源),AssetBundle(只能加载AB资源,当前设备允许访问的路径都可以),WWW(可以加载任意处资源,包括项目外资源(如远程服务器)),AssetDatabase(只能加载Assets目录下的资源,但只能用于Editor

星月相随的专栏 5100

DSSAD自动驾驶行车记录系统体系结构和应用

通过对其感知、决策、控制等模块的详细研究,以及对商业化和消费市场发展趋势的分析,为该领域的研究和实践提供有价值的参考。通过克服技术、安全与隐私、法规与政策等方面的挑战,并紧跟人工智能、云端服务、用户体验等发展趋势,DSSAD系统将更好地适应自动驾驶行业的发展,提供更安全、智能、便捷的驾驶辅助服务。DSSAD体系结构通过数据收集模块、加密链接和数据存储模块和数据读取模块等关键模块的协同作用,构建了一个强大而灵活的自动驾驶数据记录系统,为未来智能出行提供了坚实的技术基础。

一只老虎的专栏 2208

解析AI人工智能领域AI芯片的散热技术

当你用ChatGPT写代码、用AI生成高清图片时,背后的AI芯片可能正在“发高烧”——全球TOP500超算的平均功耗已突破10兆瓦,单颗GPU的峰值功耗超过700W(相当于3台家用空调同时运行)。本文将聚焦AI芯片的散热技术,覆盖从基础原理到前沿方案的全链条解析,帮助读者理解“散热为什么比算力更重要”。

AIGC应用创新大全的博客 936

Unity 之 Addressable可寻址系统 -- 资源加载和释放 -- 进阶(二)

本篇文章从资源加载的方式和具体示例演示,为大家介绍可寻址资源系统的资源加载和资源释放。

陈言必行 -- Unity游戏开发领域优质博主 8287

LeRobot 入门教程(二)强化学习训练及 SmolVLA 模型微调

本文介绍了LeRobot框架中基于人类在环的样本高效强化学习(HIL-SERL)工作流,包含真实机器人训练和模拟环境训练两大模块。在真实机器人部分,详细说明了从配置设置、工作空间边界确定、演示数据收集、奖励分类器训练到演员-学习者架构部署的全流程,并强调了人类干预的关键作用。同时介绍了适用于模拟训练的gym_hil环境及其配置使用方法。最后,文章提供了微调SmolVLA基础模型的指南,包括数据集收集、微调步骤和模型评估方法。该工作流实现了人机协作的高效强化学习,适用于各类机器人操作任务。

2506_90492529的博客 3897

【Unity】代码动态加载Prefab预设体

Unity学习笔记13——代码动态加载Prefab预设体   在进行一些功能开发的时候,我们常常将一些能够复用的对象制作成.prefab的预设物体,然后将预设体存放到Resources目录之下,使用时再动态加载到场景中并进行实例化。例如:子弹、特效甚至音频等,都能制作成预设体。   一个预设体要能够通过代码控制在场景中进行显示,需要三个步骤: 预设动态加载到场景 预设体实例化 实例化对象属性设置: (常见错误:对未初始化的hp_bar进行属性设置,设置之后的属性在实例化之后无法生效。这是因为我们最.

清凌的博客 3429

华为OD机试新系统真题 【简单表达式计算】

华为OD机试 新系统真题【简单表达式计算】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【简单表达式计算】题解

qq_45776114的博客 676

二维矩形件排样算法之最低水平线算法实现

最低水平线算法的简单实现(Python) 1、二维矩形排样算法众多,最早的有BL算法、下台阶算法、最低水平线算法等,其中最低水平线算法及其优化算法应用较多,是与智能优化算法(遗传算法、模拟退火算法等)结合的最多的算法,本文利用python对最低水平线算法做了实现...

峰爸的博客 1万+

Unity06_协程_资源加载_场景切换_ LineRenderer

协程_资源加载_场景切换_ LineRenderer

2503_93931574的博客 570

Valgrind 从入门到精通:内存调试和性能分析

Valgrind 提供了强大的 API,允许开发者编写自定义的检查工具。通过扩展 Valgrind,可以针对特定场景实现更精准的检测。

大模型大数据攻城狮的专栏 1217

Unity中Resources资源动态加载知识点详解

本文总结了Unity中的特殊文件夹路径获取及资源加载方法。主要包含:1)工程路径、Resources、StreamingAssets等特殊文件夹的作用和获取方式;2)Resources资源同步加载的通用方法,包括预设体、音效、文本等不同类型资源的加载;3)异步加载的实现方式及注意事项;4)资源卸载的两种方法。重点介绍了Resources文件夹的特点和使用规则,包括资源加载、内存管理及性能优化等内容,为Unity开发中的资源管理提供了实用指导。

徽程22级的在读学生 1600

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Unity AssetBundle加载和内存管理

AssetBundle资源加载 一个AssetBundle中包含两部分:数据头和数据段。 通过AssetBundle加载游戏资源,分为三步: 加载AssetBundle对象。 通过AssetBundle对象加载需要的资源。 对于非引用类型的资源,还需通过GameObject.Instantiate()创建clone。 1.加载AssetBundle对象方式 Asset...

此处有码 4277

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Unity中的三种资源加载和卸载

前言 内容转载自: https://www.cnblogs.com/zhoujiangyue/articles/7066070.html. Unity中三种资源加载方式: 1.静态引用。具体操作:创建public变量,把文件挂到物体上,在Inspector里把相应资源给public变量,用的时候instantiate或者直接用。 2.Resources.Load。加载Resources文件夹下的资源,加载后instantiate. 3.AssetBundle.Load。加载打包后的资源。 前两种资源加载方式

qq_38139885的博客 3108

入门必看:Unity资源加载及管理

Unity的资源加载及管理,基础很重要。此篇文章作为近期梳理项目内资源管理器的一个小总结,尝试尽量用人话将Unity对资源管理的关键点梳理清楚,个人觉得比较适合像我这样刚入门且对AssetBundle还不甚了解的家伙。 我理解的资源管理 举一个不恰当的例子来描述我所理解的资源管理(因为我实在想不出更合适的例子了),想象一个画面:一个表演者,站在一个台子后面,面向观众,按照规定的剧本,操作着台子...

嘿嘿 3187

unity-资源加载和卸载流程梳理

(一)最近整理资源加载和卸载,梳理了下思路画了自认为的流程图 本框架中共3块组成:对象池,资源池(AssetBundle加载出的Asset的中间管理类),AssetBundleManager(这块主要是打包的时候已经决定配置好了各个Asset间的依赖关系,与此文的关系不大,后面整理一键打包再细说) 1.同步加载关于Instantiate的小解释: 你 Instaniate一个Prefab,是一个对Assets进行Clone(复制)+引用结合的过程,GameObject transform 是Clone是新生

木马人 1572

【Unity每篇一个知识点】资源加载优化详解

资源加载优化详解

weixin_46259189的博客 875

Unity资源加载方式以及管理

资源加载接口以及分析 一、 AssetBundle.LoadFromFile (string path, uint crc, ulong offset); 同步方法 AssetBundle.LoadFromFileAsync (string path, uint crc, ulong offset); 异步方法 最快的ab包加载方式,内存占用低,不可自定义硬盘数据格式 优点: 加载效率高,内存占用低,加载时只加载文件头,只有在真正加载对应资源的时候才会加载进内存 缺点: 指定的ab包必须是未经自压缩与加密的

菜鸟的学习历程 2161

Unity 运行时资源加载

Unity提供了Resource Folders和AssetBundles两种按需加载资源方案。Resource Folders将资源存储在程序包内,通过Resources.Load()加载,适合中等大小常用资源,但会增加主包体积。AssetBundles是外部资源集合,支持本地或网络动态加载,适合大型或更新资源,需手动管理卸载。资源卸载方面:AssetBundles通过Unload()控制是否保留已加载对象,Resources需要通过Destroy()和UnloadUnusedAssets()释放内存。开

分享知识,拥抱变化 1052

细谈unity资源加载和卸载

转载请标明出处:http://www.cnblogs.com/zblade/ 一、概要 在了解unity的资源管理方式之后,接下来细谈一下Unity的资源是如何从磁盘中加载到运行时的内存中,以及又是如何被卸载的。这部分较为繁琐,可能会写较多的过程。 二、脚本资源的加载和卸载 在unity中的脚本资源,大体可以分为C++编译的引擎dll文件,c#编译的dll文件,lua脚本文件(基于lua热...

weixin_30469895的博客 681

全面理解Unity加载和内存管理

 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别。Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的。 其实场景里所有静态的

zhliu1991的专栏 453

Unity加载和内存管理

Unity有两种动态加载机制:Resources.Load和AssetBundle,二者本质并无区别。Resources.Load就是从一个缺省打进程程序包的AssetBundle(Resourece)里加载资源,而一般AssetBundle文件需要你自己创建,运行时加载。 通过AssetBunlde加载资源,分为两步,第一步是获取AssetBundle对象,第二步是通过该对象加载需要的资源。而第一步又分为两种方式,下文中将结合常用的API进行详细地描述。 第一步,获取AssetBundle对象常用地API

m0_46184795的博客 696

Unity资源加载

Unity游戏引擎 加载Asset中资源的方式:Resources/AssetBundle/Addressables,将需要加载到场景中的资源放在Asset目录下的Resources文件中,通过Unity提供的API加载资源。 创建命名为Resources的文件夹,将需要加载的资源放置于该文件夹下Load:通过路径加载资源 LoadAll:加载该Resources下的所有资源 LoadAsync:异步加载资源,通过协程实现 UnloadAsset:卸载加载的资源 FindObjectsOfTypeAll:返

PROMISEa的博客 514

unity资源的计数型AssetBundle加载管理

unity资源的计数型AssetBundle加载管理 那内存管理有我们动态申请的程序运行或者计算使用的内存,还有一部分就是动态加载进来的资源的内存。 那这篇说的是关于资源内存管理的。 说的好像很高端,其实是个很简单的东西 在MVC的结构下,资源内存管理和AB加载是一个独立的模块 资源内存管理引用加载器,形成一个单独的模块我把它叫做Loader(加载器) 首先第一点,为什么要做资源内存管理 很明显...

神一般的狄狄的小黑屋 1497
上一篇: 走迷宫 II
下一篇: 6.4. 投掷硬币
枫景Maple
博客等级 码龄2年 485粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值