如题,destroyimadiate是立即将物体从场景hierachy中移除,并标记为 "null",注意 是带引号的null。这是UNITY内部的一个处理技巧。关于这个技巧有很争议。

destroy要等到帧末才会将物体从场景层级中移除并标记为"null"。

不管如何,二者都只是UNITY引擎层面的标记与处理,但在.NET底层,对象的内存都没有释放,只有手动GC.COLLECT或等待NET去GC时才会释放掉对象内存。

测试代码如下:点ADD按钮不断创建对象,点DEL按钮清除所有对象,通过观察进程内存数值来察看对象内存是否释放。

 using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
using UnityEngine.UI; public class MyGo : MonoBehaviour
{
byte[] data = new byte[];
}
public class testad : MonoBehaviour { Transform objs;
Text txt; Process proc;
// Use this for initialization
void Start () {
var btnadd = transform.Find("btnAdd").GetComponent<Button>();
btnadd.onClick.AddListener(OnClckAdd);
var btndel = transform.Find("btnDel").GetComponent<Button>();
btndel.onClick.AddListener(OnClckDel); objs = transform.Find("objs"); txt = transform.Find("Text").GetComponent<Text>();
proc = Process.GetCurrentProcess();
} void OnClckAdd()
{
for (int i = ; i < ; ++i)
{
var go = new GameObject();
go.AddComponent<MyGo>();
go.transform.SetParent(objs);
}
} void OnClckDel()
{
for (int i = objs.childCount - ; i >= ; i--)
{
GameObject.DestroyImmediate(objs.GetChild(i).gameObject);
} System.GC.Collect();
}
// Update is called once per frame float timer = ;
void Update () {
if (timer > 0.5f)
{
timer = ;
txt.text = ((int)(proc.WorkingSet64 / )).ToString();
}
timer += Time.deltaTime;
}
}

UNITY Destroy()和DestroyImadiate()都不会立即释放对象内存的更多相关文章

  1. UNITY Destroy()和DestroyImadiate()的区别

    using System.Collections; using System.Collections.Generic; using System.Timers; using UnityEngine; ...

  2. Unity开发实战探讨-资源的加载释放最佳策略

    注:本文中用到的大部分术语和函数都是Unity中比较基本的概念,所以本文只是直接引用,不再详细解释各种概念的具体内容,若要深入了解,请查阅相关资料. Unity的资源陷阱 游戏资源的加载和释放导致的内 ...

  3. 【Unity】3.1 利用内置的3D对象创建三维模型

    分类:Unity.C#.VS2015 创建日期:2016-04-02 一.基本概念 Unity已经内置了一些基本的3D对象,利用这些内置的3D对象就可以直接构建出各种3D模型(当然,复杂的三维模型还需 ...

  4. linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解?

    问: linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解? 每个进程所拥有的4G独立的虚拟内存空间是什么意思?linux系统的虚拟4G空间中,高位的1G是用于系统内核运行的,那 ...

  5. js原型对象,每个new出来的新对象都有独立的原型对象__proto__

    刚才看一篇博文的时候, 动手测试了一下 JavaScript的原型链, 原型对象,发现每个构造器(赋给了某个 prototype ) new 出来的对象都有各自独立的原型对象 __proto__. p ...

  6. python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

    python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

  7. Memory Ordering (注意Cache带来的副作用,每个CPU都有自己的Cache,内存读写不再一定需要真的作内存访问)

    Memory Ordering   Background 很久很久很久以前,CPU忠厚老实,一条一条指令的执行我们给它的程序,规规矩矩的进行计算和内存的存取. 很久很久以前, CPU学会了Out-Of ...

  8. Unity开发实战探讨-资源的加载释放最佳策略简要心得

    Unity开发实战探讨-资源的加载释放最佳策略简要心得 看过我另外一篇关于Unity资源释放随笔<Unity开发实战探讨-资源的加载释放最佳策略>如果觉得略微复杂,那么下面是一些比较简要的 ...

  9. unity, destroy gameObject & destroy all children

    一,destroy gameObject 删除名为xxx的gameObject 错误方法1: Destroy(xxx); 以上方法之所以错误,是因为Destroy在下一帧才生效,而在本帧之内xxx还存 ...

随机推荐

  1. java运行jar命令提示没有主清单属性和找不到主类

    推荐一个java运行jar命令提示没有主清单属性的百度经验的链接:https://jingyan.baidu.com/article/db55b60990f6084ba30a2fb8.html jav ...

  2. Luogu 4149 Race

    Luogu 4149 Race 用点分治解决. 点分治在计算路径贡献时,为了不统计在一颗子树中的路径,解决方法一种是容斥,但在这种求最值问题中不便用容斥来撤销. 另一种则是,处理一颗子树时,只考虑前面 ...

  3. BZOJ4566 Haoi2016 找相同字符【广义后缀自动机】

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...

  4. ubuntu 新手帖

    作为菜鸟,接触ubuntu的时间不长,遇到一些问题,在这总结一下,可能不全不完善,但是希望能有用: 1,ubuntu 12.04的gedit打开中文记事本全是乱码的处理 参考:http://bbs.c ...

  5. 获得消息的x,y的窗口内坐标(包括边框和titlebar高度

    rectWindow = D2D.GetWindowRect(self.hwnd)#窗口大小 rectClient = D2D.GetWindowRect(self.hwnd,True)#客户区大小 ...

  6. memsql 基本安装试用

    备注:使用docker 进行安装 1. 基本准备 a. 环境检查(必须,不然会有服务启动异常的问题) docker run --rm memsql/quickstart check-system b. ...

  7. InnoSetup 打包Winform程序

    在VS2012之前,我们做安装包一般都是使用VS自带的安装包制作工具来创建安装包的,VS2012.VS2013以后,微软把这个去掉,集成使用了InstallShield进行安装包的制作了,虽然思路差不 ...

  8. sqlplus连接的三种方式

    sys用户在cmd下以DBA身份登陆: sqlplus /nolog      --运行sqlplus命令,进入sqlplus环境.其中/nolog是不登陆到数据库服务器的意思,如果没有/nolog参 ...

  9. 2DAY初识python

    一.变量 1 什么是变量之声明变量 #变量名=变量值 age=18 gender1='male' gender2='female' 2 为什么要有变量 变量作用:“变”=>变化,“量”=> ...

  10. bfs判断子图是否连通

    int judge() { int v[13] = { 0 }; queue<int> myq; myq.push(ans[0]); v[ans[0]] = 1; while (!myq. ...