Resources.UnloadUnusedAssets
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的更多相关文章
- 关于AB包的释放与 Resources.UnloadUnusedAssets的关系
Resources.UnloadUnusedAssets 并不能释放AB包中东西,只能释放从AB包中加载出来的资源,也可以释放场景中的资源,其它不是从AB包加载来的资源. AB加载后,整个包都加载到内 ...
- Unity AssetBundles and Resources指引 (四) AssetBundle使用模式
本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...
- Unity AssetBundles and Resources指引 (一)
本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...
- Unity 最佳实践
转帖:http://www.glenstevens.ca/unity3d-best-practices/ 另外可以参考:http://devmag.org.za/2012/07/12/50-tips- ...
- 玩转Unity资源,对象和序列化(下)
本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unity如何维护不同对象之间的强引用.另外还会讨论对象与资源的技术实现差别. 译注:除非特别说明 ...
- Unity内存理解(转)
Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBu ...
- Unity3D中可中途释放的单例
Unity3D中可中途释放的单例 使用静态类,静态变量的坏处是从程序加载后就一直占用内存,想要释放比较麻烦,可是之前使用的单例,没有提供释放的方法,那是不是也同静态的一样直到程序结束菜释放?那单例的好 ...
- [转]全面理解Unity加载和内存管理
[转]全面理解Unity加载和内存管理 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质 ...
- KEngine:Unity3D资源的打包、加载、调试监控
资源模块做什么? 资源模块——ResourceModule,是KEngine中最核心的模块,其他模块基本或多或少的对它有依赖,它主要的功能是:资源打包.路径定义.资源管理.资源调试. 资源模块对Uni ...
随机推荐
- 使用javaScript 取cookie时需要注意的
function getCookie(name) { var cookies = window.top.document.cookie.split('; ');//分号后面有个空格 for (var ...
- json-lib无法下载
maven无法下载json-lib 配置一下这个 <classifier>jdk15</classifier> 因为远程提供了两个
- Eclipse Java EE IDE for Web Developers 4.5.1 安装hibername tools 插件
方式一:在线安装(太慢) 方式二:离线安装,下载hibernate tools 插件到本地,然后在eclipse菜单栏点击 help: ①添加插件,选择下载后的插件,内容框中可选择hibernate ...
- eureka和feign的使用
1 eureka和feign的简介(copy来的) eureka:Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务.Spring Cloud将它集成在其子项目spring- ...
- 17、Observer 观察者模式
以一个实例给大家引入观察者,大家多多少少都写过html或者java中的swing.我们定义一个按钮,给他增加一个点击事件,那么这个方法是怎么被触发到呢,对了,就是利用了观察者设计模式 观察者模式 当对 ...
- DevOps让金融业数字化转型更敏捷 | 分享实录
以下为博云近期在活动中分享的关于<如何通过 DevOps 让数字化转型变得更加敏捷>的主题演讲实录. 01 金融科技进入VUCA时代 大家好,今天分享的题目是<如何通过 DevOps ...
- idea中GitPush失败问题
首先是你的项目中有和和历史不符的东西 Push rejected: Push to *****/***** was rejected 推拒绝:推送到起源/主人被拒绝 直接是解决办法,直接打开你要上传代 ...
- C#LeetCode刷题-拒绝采样
拒绝采样篇 # 题名 通过率 难度 470 用 Rand7() 实现 Rand10() 34.4% 中等 478 在圆内随机生成点 22.8% 中等
- Python 为什么要在 18 年前引入布尔类型?且与 C、C++ 和 Java 都不同?
花下猫语:在上一篇<Python 为什么能支持任意的真值判断? >文章中,我们分析了 Python 在真值判断时的底层实现,可以看出 Python 在对待布尔值时,采用了比较宽泛的态度.官 ...
- 阿里云体验实验室 教你如何《快速搭建LNMP环境》
## 体验平台简介 面向开发者和中小企业打造的一站式.全云端的开发平台,打开浏览器就可以开发.调试.上线,所测即所得,并结合无服务器的模式,重新定义云原生时代的研发工作方法论.旨在降低开发者上手成本和 ...