UNITY Destroy()和DestroyImadiate()都不会立即释放对象内存
UNITY Destroy()和DestroyImadiate()都不会立即释放对象内存
如题,destroyimadiate是立即将物体从场景hierachy中移除,并标记为 "null",注意 是带引号的null。这是UNITY内部的一个处理技巧。关于这个技巧有很争议。
destroy要等到帧末才会将物体从场景层级中移除并标记为"null"。
不管如何,二者都只是UNITY引擎层面的标记与处理,但在.NET底层,对象的内存都没有释放,只有手动GC.COLLECT或等待NET去GC时才会释放掉对象内存。
测试代码如下:点ADD按钮不断创建对象,点DEL按钮清除所有对象,通过观察进程内存数值来察看对象内存是否释放。
1 using System.Collections; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using UnityEngine; 5 using UnityEngine.UI; 6 7 public class MyGo : MonoBehaviour 8 { 9 byte[] data = new byte[83000]; 10 } 11 public class testad : MonoBehaviour { 12 13 Transform objs; 14 Text txt; 15 16 Process proc; 17 // Use this for initialization 18 void Start () { 19 var btnadd = transform.Find("btnAdd").GetComponent<Button>(); 20 btnadd.onClick.AddListener(OnClckAdd); 21 var btndel = transform.Find("btnDel").GetComponent<Button>(); 22 btndel.onClick.AddListener(OnClckDel); 23 24 objs = transform.Find("objs"); 25 26 txt = transform.Find("Text").GetComponent<Text>(); 27 proc = Process.GetCurrentProcess(); 28 } 29 30 void OnClckAdd() 31 { 32 for (int i = 0; i < 20; ++i) 33 { 34 var go = new GameObject(); 35 go.AddComponent<MyGo>(); 36 go.transform.SetParent(objs); 37 } 38 } 39 40 void OnClckDel() 41 { 42 for (int i = objs.childCount - 1; i >= 0; i--) 43 { 44 GameObject.DestroyImmediate(objs.GetChild(i).gameObject); 45 } 46 47 System.GC.Collect(); 48 } 49 // Update is called once per frame 50 51 float timer = 0; 52 void Update () { 53 if (timer > 0.5f) 54 { 55 timer = 0; 56 txt.text = ((int)(proc.WorkingSet64 / 1024)).ToString(); 57 } 58 timer += Time.deltaTime; 59 } 60 }
posted on 2017-09-22 15:09 时空观察者9号 阅读(...) 评论(...) 编辑 收藏
UNITY Destroy()和DestroyImadiate()都不会立即释放对象内存相关推荐
- UNITY Destroy()和DestroyImadiate()的区别
UNITY Destroy()和DestroyImadiate()的区别 using System.Collections; using System.Collections.Generic; usi ...
- 【Unity】3.1 利用内置的3D对象创建三维模型
分类:Unity.C#.VS2015 创建日期:2016-04-02 一.基本概念 Unity已经内置了一些基本的3D对象,利用这些内置的3D对象就可以直接构建出各种3D模型(当然,复杂的三维模型还需 ...
- Unity移动端游戏性能优化简谱之 常见游戏内存控制
<Unity移动端游戏性能优化简谱>从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能 ...
- Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement
Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement 在上一篇文章中, 我们对整个Graphic部分做了概述, 这篇文章我们介绍ICanvasElement和 ...
- 图文并茂,傻瓜都能看懂的 JVM 内存布局
本 JVM 系列属于本人学习过程当中总结的一些知识点,目的是想让读者更快地掌握 JVM 相关的知识要点,难免会有所侧重,若想要更加系统更加详细的学习 JVM 知识,还是需要去阅读专业的书籍和文档. 本 ...
- Java 对象都是在堆上分配内存吗?
为了防止歧义,可以换个说法:Java对象实例和数组元素都是在堆上分配内存的吗? 答:不一定.满足特定条件时,它们可以在(虚拟机)栈上分配内存. JVM内存结构很重要,多多复习 这和我们平时的理解可能有 ...
- 从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的?
转载自 从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的? 先回顾一下Java程序执行的过程: Java程序执行时,第一步系统创建虚拟机进程,然后虚拟器用类加载器Class Loade ...
- C#开发笔记之22-C#中的int、long、float、double等类型都占多少个字节的内存。
本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#开发笔记之22-C#中的int.long.float.double等类型都占多少个字节的内存. | .Net中文网. C#开发笔记 ...
- 实验5.6 定义包含5个元素的对象数组,每个元素都是Employee类型的对象
题目 定义包含5个元素的对象数组,每个元素都是Employee类型的对象. Employee类,其中包括姓名.街道地址.城市和邮编等属性,以及change_name()和display()等函数.di ...
最新文章
- django model filter_Django分表的两个方案
- x射线直接投影成像的条件_告诉你如何区分X射线DR、CR和胶片成像?
- 配置管理小报110221:在linux上用真实帐号发mail的方法
- Spring @AutoWired实现原理
- [perl]字符串转拼音首字母(支持多音字)
- 若存在linux samba共享需关闭,Samba共享后不能访问是selinux惹的祸
- Atiitt 关于不可替代性的思索 目录 1.1. 不可替代性与 这份工作谁都能干无关	1 1.2. 不可替代性未必很好,因为其岗位可能很累或者收入很低	1 1.3. 不可替代性与报酬无关	1 2
- 75道程序员面试逻辑思维题
- matlab输出复数值到.txt文件中
- 9.【Windows】如何制作原版Win10系统盘
- VS2013的下载与安装
- protobuf 3 的简单使用
- 在VS2017中添加WTL窗口
- 计算机网络与互联网(三)
- SpringBoot-HelloWorld
- 用java画跳棋棋盘
- 在线支付——如何防止订单重复支付?
- 通过一个具体的例子,讲解 SAP BDC 技术的使用步骤
- Q3全球太阳能企业融资规模达30亿美元 环增76%
- ESC32硬件---电路分析二(电流检测和反电动势检测)
热门文章
- SpringBoot+Vue整合WebSocket实现前后端消息推送
- Android中使用retrofit2进行网络get请求查询数据和post请求上传文件
- Winform中设置DevExpress的RadioGroup的items从配置文件中加载
- Java中实现按字符串位数在前面补0
- spring系列-注解驱动原理及源码-声明式事务使用及原理解析
- Centos7下安装Docker(详细安装教程、傻瓜式安装)
- 因为有了这个画图工具集,老师同学都说我画的图有特色(Processon,draw.io,Xmind)
- huggingface实操_Transformers 简介(上)
- matlab偶极矩电场强度分布图_1.2.10 电介质在外电场下的极化、电极化强度、电极化率...
- 免费直播 | 特邀大厂产品战略咨询顾问,详解数据驱动产品商业化