Unity3D占用内存太大怎么解决呢? -下

news/2024/5/2 19:39:40/文章来源:https://blog.csdn.net/weixin_55688630/article/details/128027037

什么时候才是UnusedAssets?
看一个例子:
Object obj = Resources.Load("MyPrefab");
GameObject instance = Instantiate(obj) as GameObject;
.........
Destroy(instance);
创建随后销毁了一个Prefab实例,这时候 MyPrefab已经没有被实际的物体引用了,但如果这时:
Resources.UnloadUnusedAssets();
内存并没有被释放,原因:MyPrefab还被这个变量obj所引用
这时候:
obj = null;
Resources.UnloadUnusedAssets();
这样才能真正释放Assets对象
所以:UnusedAssets不但要没有被实际物体引用,也要没有被生命周期内的变量所引用,才可以理解为 Unused(引用计数为0)
所以所以:如果你用个全局变量保存你Load的Assets,又没有显式的设为null,那 在这个变量失效前你无论如何UnloadUnusedAssets也释放不了那些Assets的。如果你这些Assets又不是从磁盘加载的,那除了 UnloadUnusedAssets或者加载新场景以外没有其他方式可以卸载之。

一个复杂的例子,代码很丑陋实际也不可能这样做,只是为了加深理解

IEnumerator OnClick()
{
Resources.UnloadUnusedAssets();//清干净以免影响测试效果
yield return new WaitForSeconds(3);
float wait = 0.5f;
//用www读取一个assetBundle,里面是一个Unity基本球体和带一张大贴图的材质,是一个Prefab
WWW aa = new WWW(@"file://SpherePrefab.unity3d");
yield return aa;
AssetBundle asset = aa.assetBundle;
yield return new WaitForSeconds(wait);//每步都等待0.5s以便于分析结果
Texture tt = asset.Load("BallTexture") as Texture;//加载贴图
yield return new WaitForSeconds(wait);
GameObject ba = asset.Load("SpherePrefab") as GameObject;//加载Prefab
yield return new WaitForSeconds(wait);
GameObject obj1 = Instantiate(ba) as GameObject;//生成实例
yield return new WaitForSeconds(wait);
Destroy(obj1);//销毁实例
yield return new WaitForSeconds(wait);
asset.Unload(false);//卸载Assetbundle
yield return new WaitForSeconds(wait);
Resources.UnloadUnusedAssets();//卸载无用资源
yield return new WaitForSeconds(wait);
ba = null;//将prefab引用置为空以后卸无用载资源
Resources.UnloadUnusedAssets();
yield return new WaitForSeconds(wait);
tt = null;//将texture引用置为空以后卸载无用资源
Resources.UnloadUnusedAssets();
}

这是测试结果的内存Profile曲线图

Unity3D占用内存太大怎么解决呢?

图片:p12.jpg

很经典的对称造型,用多少释放多少。

这是各阶段的内存和其他数据变化

Unity3D占用内存太大怎么解决呢?

图片:p13.jpg

说明:
1 初始状态
2 载入AssetBundle文件后,内存多了文件镜像,用量上升,Total Object和Assets增加1(AssetBundle也是object)
3 载入Texture后,内存继续上升,因为多了Texture Asset,Total Objects和Assets增加1
4 载入Prefab后,内存无明显变化,因为最占内存的Texture已经加载,Materials上升是因为多了Prefab的材质,Total Objects和Assets增加6,因为 Perfab 包含很多 Components
5 实例化Prefab以后,显存的Texture Memory、GameObjectTotal、Objects in Scene上升,都是因为实例化了一个可视的对象
6 销毁实例后,上一步的变化还原,很好理解
7 卸载AssetBundle文件后,AssetBundle文件镜像占用的内存被释放,相应的Assets和Total Objects Count也减1
8 直接Resources.UnloadUnusedAssets,没有任何变化,因为所有Assets引用并没有清空
9 把Prefab引用变量设为null以后,整个Prefab除了Texture外都没有任何引用了,所以被UnloadUnusedAssets销毁,Assets和Total Objects Count减6
10 再把Texture的引用变量设为null,之后也被UnloadUnusedAssets销毁,内存被释放,assets和Total Objects Count减1,基本还原到初始状态

从中也可以看出:
Texture加载以后是到内存,显示的时候才进入显存的Texture Memory。
所有的东西基础都是Object
Load的是Asset,Instantiate的是GameObject和Object in Scene
Load的Asset要Unload,new的或者Instantiate的object可以Destroy

Unity 3D中的内存管理

Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备的游戏开发,动辄内存占用飙上一两百兆,导致内存资源耗尽,从而被系统强退造成极 差的体验。类似这种情况并不少见,但是绝大部分都是可以避免的。虽然理论上Unity的内存管理系统应当为开发者分忧解难,让大家投身到更有意义的事情中 去,但是对于Unity对内存的管理方式,官方文档中并没有太多的说明,基本需要依靠自己摸索。最近在接手的项目中存在严重的内存问题,在参照文档和 Unity Answer众多猜测和证实之后,稍微总结了下Unity中的内存的分配和管理的基本方式,在此共享。

虽然Unity标榜自己的内存使用全都是“Managed Memory”,但是事实上你必须正确地使用内存,以保证回收机制正确运行。如果没有做应当做的事情,那么场景和代码很有可能造成很多非必要内存的占用, 这也是很多Unity开发者抱怨内存占用太大的原因。接下来我会介绍Unity使用内存的种类,以及相应每个种类的优化和使用的技巧。遵循使用原则,可以 让非必要资源尽快得到释放,从而降低内存占用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_225345.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.XMLHttpRequest对象

XMLHttpRequest简称xhr,是浏览器提供的Javascript对象。之前我们使用的都是jQuery中的Ajax,现在我们使用原生JS的Ajax 目录 1 GET请求 1.1 不带参数请求 1.2 带参数请求 2 URL的编码与解码 2.1 编码 encodeURI() 2.2 解码 decodeURI() 3 …

【通用设计方法】之接收异常保护

目录 前言 一、接收异常保护 二、超短包、背靠背的支持 后记 前言 为了系统的鲁棒性,我们常常会做一系列的异常保护功能,避免系统挂死。 这里仅仅介绍接收保护的某些设计思路,抛砖引玉。 一、接收异常保护 设计思路:通过可配…

数据可视化大屏设计

在数据业务展示场景中,数据可视化大屏已经变得十分常见。那么在设计思路上,数据可视化大屏应当遵循什么样的设计逻辑?本篇文章里做了介绍,一起来看一下。 一、数据大屏的应用场景 1、大型会议 2、业务展示 二、数据大屏分类 1、展…

C语言源代码系列-管理系统之会员计费系统

往期文章分享点击跳转>《导航贴》- Unity手册,系统实战学习点击跳转>《导航贴》- Android手册,重温移动开发 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过…

【Python百日进阶-WEB开发-冲進Flask】Day183 - Flask数据库ORM基础、增加

文章目录一、day03项目环境和结构搭建1.1 flask-script1.1.1 flask-script是干什么的?1.1.2 flask-script安装1.1.3 flask-script的使用1.1.3.1 创建Manager实例1.1.3.2 初始化实例出错与解决1.1.4 终端启动1.1.4.1 查看runserver参数1.1.5 自定义添加manager命令1.…

linux篇【11】:linux下的线程<前序>

目录 一.linux下的线程 1.linux下的线程概念 (1)教材上粗略的 线程 定义 (2)线程的引入 (3)线程真正定义 以及 示意图 (4)linux 和 windows等其他操作系统的线程对比 &#xf…

新的趋势:From Big to Small and Wide data

新的趋势:From Big to Small and Wide data 所以,在这个时候,作为率先提出要做 MySQL 开源 HTAP 数据库的 StoneDB,想要稍微冷静一下。 不是说我们不做 HTAP 了,而是有了一个新的思路。这个思路,也同样来…

【亲测】网址引导页管理系统

介绍: 易航网址引导系统-网址引导页管理系统去授权版一款极其优雅的易航网址引导页管理系统, 如果有问题可以跟我反馈,共同进步。祝各位道友一路飞升,顶峰相见!内置12套模板和防墙插件。 项目亮点: 1、…

Redis基础命令(String类型)Value为JSON

目录 String类型(存储的值为JSON形式) 问题: 解决办法: 示例: 实际操作: 总结: String类型(存储的值为JSON形式) 问题: Redis没有类似MySql中的表的概…

2022年戈登·贝尔奖授予等离子体加速器突破研究

ACM 总裁Cherri Pancake(图片来源:网络) 11月17日,在达拉斯举行的SC22颁奖典礼上,ACM将2022年戈登贝尔奖(Gordon Bell Prize)授予了一组研究人员,他们利用四台超级计算机&#xff08…

【Flink】基本转换算子使用之fliter、flatMap,键控流转换算子和分布式转换算子

文章目录一 Flink DataStream API1 基本转换算子的使用(1)flitera 使用匿名类实现b 使用外部类函数实现b 使用flatMap实现(2)flatMapa 使用匿名类实现b 使用匿名函数实现2 键控流转换算子(1) keyBy&#xf…

中国互联网众筹行业

近些年,中国互联网发展迅速,众筹这种起源于美国的新型互联网金融模式更是一直处于风口浪尖。在“大众创业、万众创新”的背景下,这种低门槛的融资模式也深受欢迎,加上阿里、京东、苏宁三大电商的巨头的相继入场,更令这…

IMS各网元的主要功能

文章目录用户注册时: 手机发出一个注册消息到他所在的拜访地的P。 比如,他是山西太原的用户,他这时候到了北京,那么这个时候,他要注册到IMS网络里面的话,这个P-CSCF就是北京的P-CSCF,这个北京的…

CAS号:376364-38-4,rCRAMP (rat)

rCRAMP (rat) 是一种大鼠组织蛋白酶相关的抗菌肽,有助于大鼠脑肽/蛋白质提取物的抗菌活性。rCRAMP (rat) 是大鼠中枢神经系统先天免疫系统的关键参与者。rCRAMP (rat) is the rat cathelin-related antimicrobial peptide. rCRAMP (rat) contributes to the antibac…

Kotlin 开发Android app(十一):Android控件RecyclerView

Android 中的控件非常的丰富,我们会陆陆续续的进行介绍,从第九节开始,关于Kotlin 的语法特性就差不多结束,后面如果有发现需要说明的语法,再进行相关的补充。 在Android的控件中,RecyclerView算是一个大控…

从 Uber 数据泄露事件我们可以学到什么?

Uber 数据泄露始于一名黑客从暗网市场购买属于一名 Uber 员工的被盗凭证。最初尝试使用这些凭据连接到 Uber 的网络失败,因为该帐户受 MFA 保护。为了克服这一安全障碍,黑客通过 What’s App 联系了 Uber 员工,并假装是 Uber 的安全人员&…

OA系统,有效提升企业办公效率落实执行力

企业管理的成功将最终取决于企业的执行情况,只要有良好的经营管理,管理系统,一个好的领导者,充分调动员工的积极性,将能最大限度的管理执行力。 OA协同办公系统提供了工作流和协同工作互补结合。工作流程严格规定了工作…

大数据面试题(四):Yarn核心高频面试题

文章目录 Yarn核心高频面试题 一、简述Hadoop1与Hadoop2的架构异同 二、为什么会产生yarn,它解决了什么问题,有什么优势? 三、HDFS的数据压缩算法?及每种算法的应用场景? 1、gzip压缩 2、Bzip2压缩 3、Lzo压缩 …

为什么 NGINX 的 reload 不是热加载?

作者:刘维 这段时间在 Reddit 看到一个讨论,为什么 NGINX 不支持热加载?乍看之下很反常识,作为世界第一大 Web 服务器,不支持热加载?难道大家都在使用的 nginx -s reload 命令都用错了? 带着这个…

数据治理系列:数仓建模之数仓主题与主题域

背景: 数据仓库之父 Bill Inmon 将数据仓库描述为一个面向主题的、集成的、稳定的、反应历史变化的数据集合,用于支持管理者的决策过程。 从上面的引言里面,我们其实可以知道主题在数仓建设里面绝对是很重要的一环,这的确是的。…