zoukankan      html  css  js  c++  java
  • Unity中销毁游戏对象的方式

    销毁方式

    销毁物体的方式有两种:Destroy和DestroyImmediate两种,那两者有什么区别呢?细听分说。

    两种方式都能达到销毁物体的目的,有以下区别:

    Destroy销毁场景中的物体但是内存还存在,或一段时间没有再次被使用,才会销毁并且释放内存,这样避免了频繁对内存的读写操作,系统回收器会定时清理内存中没有被引用的对象,很可能有些地方你依然引用了该对象在你自己都不知道的地方,或者你忽略的地方,直接销毁会导致引用地方出现空引用的引用错误。

    DestroyImmediate则是立即销毁对象,并从内存中移除掉。

    例子

    比如说你要销毁某一物体下的10个子物体,假设是要销毁A物体下的a0--a9,10个子物体

     1 ///<summary> 
     2 ///脚本挂在A物体上
     3 ///  <summary> 
     4 public class AGameOnject: MonoBehaviour  
     5     {  
     6 
     7         void Start ()  
     8         {  
     9             for (int i = 0; i < transform.childCount; i++) {  
    10                 Destroy (transform.GetChild (i).gameObject);  
    11             }  
    12         }  
    13 
    14     }  

    通过以上代码就可实现销毁了A下所有子物体,但是有些人会有疑问,为什么这个地方是GetChild(i),每删除一个后面的物体不应该向前移吗?索引会减一的。

    所以这就是Destroy的机制,在执行了Destroy后,程序并不能立即检测到该物体被销毁了获取数量是依然是10个。

    但如果是DestroyImmediate就不能这样写了,如下:

     1 public class AGameObject : MonoBehaviour
     2 {
     3 
     4     void Start ()
     5     {  
     6         int count = transform.childCount;
     7         for (int i = 0; i < count; i++) {  
     8             DestroyImmediate (transform.GetChild (0).gameObject);
     9         }  
    10 
    11     }
    12 
    13 }  

    因为DestroyImmediate 一执行就会立即销毁,并释放内存,数量就会减一,后面的物体的索引就会向前移动。

    总结

    DestroyImmediate 一旦销毁就会立即销毁,并释放内存。执行这个操作需要消耗更多时间,影响主线程进行,而Destroy是异步销毁,一般在下一帧就会销毁,不会影响主线程的进行。

    欢迎指正。

  • 相关阅读:
    cytoscape-d3-force api
    Python基础编程 模块的引入与定义
    更改Ubuntu内核版本
    Jupyter Notebook默认路径修改
    YJZH 前端部署记录 CentOS+Nginx+Vue
    dotnet core webapi centos 服务自启动
    Linux修改时区
    空间数据实战(1)——MySQL
    记录window.sessionStorage的一个小坑
    ElementUI默认表单项el-form-item间距修改
  • 原文地址:https://www.cnblogs.com/answer-yj/p/10931231.html
Copyright © 2011-2022 走看看