2017.11.7更新:

其实这个函数就是顾名思义,关键是理解AssetBundle, Asset, GameObject, 资源等之间的关系,参考此文即可:

http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html

---------------------------------羞耻的分割线-------------------------------------------

项目每60秒执行一次Resources.UnloadUnusedAssets。所以后续的GC不会一下子需要清理很多内存,所以游戏不会卡顿。

下面是查阅一下资料得到观点,应该有错漏,希望大神指正,谢谢。

1.

官方说法:An asset is deemed to be unused if it isn't reached after walking the whole game object hierarchy,
including script components. Static variables are also examined.
The script execution stack, however, is not examined so an asset referenced
only from within the script stack will be unloaded。
And, if necessary, loaded back in the next time one of its properties or methods is used.
This requires extra care for assets which have been modified in memory.
Make sure to call EditorUtility.SetDirty before an asset garbage collection is triggered.
我对上面的理解是,Resources.UnloadUnusedAssets只对Unity的组件脚本内的变量/属性引用的资源和所有静态变量引用的
(静态类的成员引用也算,这里的引用包括多重引用)资源,进行unused标记unload,因为剩下的就是栈上变量(local variable)引用的资源,
这些资源会在变量出栈时unload掉(应该是类似UnloadUnusedAssets),如果这时要再使用这些资源,就需要重新load,即modified in memory。

这里的理解有误的话,麻烦指出。

2.

现在的老大说,Resources.UnloadUnusedAssets只是标记,并不清理,并且不是标记为空闲(这个是GC干的,就是mono的清理,因为mono不归还内存给os,只在mono层标记为空闲,os层还是使用中),只是把该块内存降级,让gc清理。

所以destroy an object后调Resources.UnloadUnusedAssets并没有卵用,要等GC来了才生效。

3.

UnloadUnusedAssets - what exactly does "unused" mean:
1)静态变量引用的资源;Monobehavior中变量/属性引用的资源 视为“used”
2)被C#层强引用的资源,视为“used”
3) 弱引用被Unity视为“unused”,是会被清掉的;
但是(先GC.Collect,再UnloadUnusedAssets则暂时清不掉,下次GC.Collect才能,或者交换顺序就能立刻清掉)
来源(已收入wiki):http://answers.unity3d.com/questions/910845/unloadunusedassets-what-exactly-does-unused-mean.html

4.

It only unloads assets that have been destroyed:
意思是我们Destroy掉的GameObject还是占着内存,被这个接口标记后才能被gc回收。
这个说法对吗?
来源:http://answers.unity3d.com/questions/720239/does-unloadunusedassets-unload-non-active-or-occlu.html

Resources.UnloadUnusedAssets的更多相关文章

  1. 关于AB包的释放与 Resources.UnloadUnusedAssets的关系

    Resources.UnloadUnusedAssets 并不能释放AB包中东西,只能释放从AB包中加载出来的资源,也可以释放场景中的资源,其它不是从AB包加载来的资源. AB加载后,整个包都加载到内 ...

  2. Unity AssetBundles and Resources指引 (四) AssetBundle使用模式

    本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...

  3. Unity AssetBundles and Resources指引 (一)

    本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...

  4. Unity 最佳实践

    转帖:http://www.glenstevens.ca/unity3d-best-practices/ 另外可以参考:http://devmag.org.za/2012/07/12/50-tips- ...

  5. 玩转Unity资源,对象和序列化(下)

    本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unity如何维护不同对象之间的强引用.另外还会讨论对象与资源的技术实现差别. 译注:除非特别说明 ...

  6. Unity内存理解(转)

    Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBu ...

  7. Unity3D中可中途释放的单例

    Unity3D中可中途释放的单例 使用静态类,静态变量的坏处是从程序加载后就一直占用内存,想要释放比较麻烦,可是之前使用的单例,没有提供释放的方法,那是不是也同静态的一样直到程序结束菜释放?那单例的好 ...

  8. [转]全面理解Unity加载和内存管理

    [转]全面理解Unity加载和内存管理 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质 ...

  9. KEngine:Unity3D资源的打包、加载、调试监控

    资源模块做什么? 资源模块——ResourceModule,是KEngine中最核心的模块,其他模块基本或多或少的对它有依赖,它主要的功能是:资源打包.路径定义.资源管理.资源调试. 资源模块对Uni ...

随机推荐

  1. 00-java语言概述

    1.基础常识软件:即一系列按照特定顺序组织的计算机数据和指令的集合.分为:系统软件 和 应用软件 系统软件:windows , mac os , linux ,unix,android,ios,... ...

  2. RxJS 中的观察者和迭代器模式

    目录 前言 观察者模式 迭代器模式 RxJS 中两种模式的结合和实现 小结 参考 1. 前言 RxJS 是一个库,它通过使用observable(可观察对象)序列来编写异步和基于事件的程序.其结合了观 ...

  3. intellij idea springboot无法读取配置文件的解决方法

    问题描述 Spring Boot项目中运行之后,出现如下的错误: *************************** APPLICATION FAILED TO START *********** ...

  4. SSH全注解-annotation详细配置

    web.xml的配置: <!--Spring的装载器 --> <listener> <listener-class> org.springframework.web ...

  5. Java常用类:包装类,String,日期类,Math,File,枚举类

    Java常用类:包装类,String,日期类,Math,File,枚举类

  6. 2020-04-10:有一个 API 服务,后端只使用了数据库来持久化数据,平时在 API 网关上监控到响应时间平均值大约为10ms,现在突然上涨到 5s,而且一直居高不下。请简单描述一下你排查这个问题的思路。

    福哥答案2020-04-11: 1 排查api服务 是否是有大量请求 2 查看mysql的系统情况 cpu 磁盘io 连接数 还是要先定位问题出现在哪个环节    

  7. Vue watch对象属性并触发多个事件

    在vue中监控一个对象的属性变化,并且触发监听事件 watch: { 'user': [ { handler: (nweVal, oldVal) => { console.info('in 1 ...

  8. 为什么你的 64-bit 程序可能占用巨大的虚拟空间

    出于很多目的,我从最新的 Go 系统内核开发源码复制了一份代码,在一个正常的运行环境中构建(和重新构建)它,在构建版本基础上周期性地重新构建 Go 程序.近期我在用 ps 查看我的一个程序的内存使用情 ...

  9. 运放引脚悬空危害大,单片机PWM信号进入运放需要考虑避免运放引脚悬空

    1 问题电路 在没有烧录程序时,单片机的PWM引脚无信号,导致运放的3脚悬空,从而导致运放输出3.5V电压,从二导致后面驱动电流非常大,容易对驱动器件造成损坏 2 改进电路 通过在单片机输出增加下拉电 ...

  10. 【算法•日更•第四十七期】Mac与windows系统的差别

    小编最近装了个Mac系统,因为小编已经有笔记本可以用linux了,所以就决定在台式机上装个双系统,结果一不小心把Mac装在C盘上了,哎,说多了都是泪啊. 其实用了Mac之后才发现windows特别好用 ...