本文分析unity,资源加载释放方式

首先材质、贴图在内存中时非常消耗内存的,unity对这些资源采用的是引用计数方式即,两个Asset用同一张贴图时,贴图在内存中并不会有两份,而是共用一份。然后对贴图引用计数进行加一,如果Asset销毁时,把对应的贴图引用进行减一,当引用计数为0时,执行Resources.UnloadUnusedAssets()或者跳转场景时,这些引用计数为0的资源会被释放。

下面讨论下三种模式下,GameObject引用图片加载释放方式。

第一种:直接在unity中创建即在Hierarchy视图中创建,销毁方式Destroy(gameobject)

这种方式GameObject会让引用到贴图加载到内存,并把贴图引用加一

执行Destroy后,会删除掉GameObject但是GameObject引用的贴图,不会被销毁,只会将贴图引用减一,虽然贴图引用为0,但并不会在内存中被释放,因为还没执行。Resources.UnloadUnusedAssets()或者场景跳转。

第二种:Resources,Load加载的方式,释放资源跟第一种一样,Destroy只会销毁物体,贴图资源需要调用Resources.UnloadUnusedAssets()或者场景跳转才释放。

第三种:Assetbundle加载方式,这个较为特殊点,首先调用AssetBundle.LoadAsset() 方法时Assetbundle会在内存创建一份GameObject,贴图引用为1。使用时Instance后会在内存中重新复制一份AssetBunlde中的GameObject,这时贴图的引用会再次加一,即此时贴图的引用计数是2

执行Destroy掉instance出来的GameObject,贴图的引用会减一即1,因为Assetbundle还对其引用着,执行Assetbundle.Unload(false)对其卸载,这时贴图的引用就变成了0,调用Resources.UnloadUnusedAssets()或者场景跳转即会释放。

也就是说Assetbundle内存释放需要我们手动调用Assetbundle.Unload(xxx);这里的xxx,可以是false也可以是true。设置false时即销毁GameObject对贴图引用减一。设置为ture时,资源释放比较强制,即使从AssetBundle中Instance出来的GameObject对贴图引用着,Assetbundle.Unload(true)时也会把贴图强制设置卸载。

测试工程和使用文档

unity 内存释放分析相关推荐

  1. java 释放数组_java集合ArrayList中clear方法内存释放分析

    最近在看ArrayList源码的时候看到了ArrayList的clear方法,源码如下: public void clear() { modCount++; // clear to let GC do ...

  2. java list 内存释放_java集合ArrayList中clear方法内存释放分析

    最近在看ArrayList源码的时候看到了ArrayList的clear方法,源码如下: public void clear() { modCount++; // clear to let GC do ...

  3. android释放acitity内存,Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  4. Linux内存管理 brk(),mmap()系统调用源码分析2:brk()的内存释放流程

    Linux brk(),mmap()系统调用源码分析 brk()的内存释放流程 荣涛 2021年4月30日 内核版本:linux-5.10.13 注释版代码:https://github.com/Rt ...

  5. Unity内存管理你应该知道的底层原理

    本文首发公众号洪流学堂.洪流学堂,让你快人几步. 本文主要是Unity官方川哥的视频<浅谈Unity内存管理>的笔记及相关知识点补充,如果有时间强烈建议学习原视频: https://www ...

  6. 深入浅出再谈Unity内存泄漏

    作者:Arthuryu,腾讯高级开发工程师 著作权归作者所有.商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest导读 本文通过对内存泄漏(what)及其危害性(why)的介绍 ...

  7. Unity内存管理的原理

    [前言] 当我们谈及Unity内存管理时,我们更多的是在说手游项目上如何更好的去管理内存,如果是在端游项目上,没有那么多讲究,内存随便用. [为什么手机上内存不够用] CPU读写速度远快于内存的速度, ...

  8. Unity3D 内存 释放

    最转载自:http://cl314413.blog.163.com/blog/static/190507976201322713921743/ 近网友通过网站搜索Unity3D在手机及其他平台下占用内 ...

  9. Unity内存优化经验分享

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

最新文章

  1. MC新手入门(五十)------服务器连接 一
  2. android adb启动不了
  3. 招募 | 清华大学计算机系副教授黄民烈招募NLP方向博士后
  4. 类模板实现基于数组的栈
  5. jQuery面向对象写法规定写法样式规定
  6. re模块常用修饰符_在c语言中修饰符的用法
  7. 一种基于红黑树和timerfd的用户态定时器
  8. matlab与vc混合编程指导书.doc,vc与matlab混合编程—基于com.doc
  9. 让一个DIV对齐到底部
  10. 计算机系统结构图并简述各个部件的作用,【计算机组成原理】计算机系统
  11. 【知识兔】Excel教程与数值或日期相关的8个快捷键,绝对实用,收藏备用
  12. jsPdf前端页面直接生成Pdf盖章下载
  13. 一个由Dubbo Thread pool is EXHAUSTED引发的问题排查
  14. 嵌入式产品软件(固件)开发需要考虑的2个方面
  15. C语言----小游戏
  16. LEETCODE--mysql查询第二高薪水
  17. linux使用df命令
  18. 任务调度 cron使用
  19. excel用VBA插入列号
  20. 数字化转型——医院数字化管理平台HDMP建设历程

热门文章

  1. 排名前10的十大人力资源管理系统(EHR系统品牌)
  2. 燃!阿里技术又破世界纪录:机器阅读理解力首次超过人类!
  3. 软件测试需要学习什么 一文告诉你,软测内容需要学这些
  4. Python3 tkinter 界面布局
  5. 【JavaWeb】Java/Java web第一阶段总结
  6. 【成功解决】‘nvidia‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
  7. Python3 df.loc和df.iloc函数用法及提取指定行列位置处数值
  8. java实用教程——组件及事件处理——MouseEvent事件
  9. Css选择器-层次选择器(关系选择器)
  10. 帮我写个文案 关于Ai智能客服