浅析NGUITools.DestroyImmediate和NGUITools.Destroy的区别

来源:互联网 发布:svm算法推荐 编辑:程序博客网 时间:2024/04/30 13:33

在做项目的时候用到了NGUITools.DestroyImmediate()来做一些删除操作.这可把我害惨了......

当时的情况,看代码....


这个是加了判断条件了的,之前只有第35行.在电脑上(也就是编辑状态下)运行是OK的,但是打包apk到安卓手机上运行的时候一到这个地方就整个游戏卡死了.

先看下NGUITools的这个两个函数的定义:


可以看出来,NGUITools.Destroy()的概要,在编辑模式下会立即删除指定的物体,如果是在播放器下且删除的是gameObject对象还多了一些操作,

大概来说就是编辑模式下会用NGUITools.DestroyImmediate(),播放模式(包括安卓、苹果设备)会用NGUITools.Destroy().

但是我现在在编辑模式下用NGUITools.DestroyImmediate()和NGUITools.Destroy()都没事,在播放模式下调用NGUITools.DestroyImmediate()的时候就会卡死,看着

NGUITools.DestroyImmediate()里边的源代码在那种情况的话会调用的是Unity里边的Destroy()函数,而使用NGUITools.Destroy()的话除了多了一些操作,依然会调用

unity中的Destroy()。

而更加奇怪的是:

如果直接调用的是unity中的Destroy()会导致在编辑状态下都会卡死,而用DestroyImmediate()就可以运行.

再看看unity手册对这两个函数的解释:

Destroy():

物体obj现在被销毁或在指定了t时间过后销毁。如果obj是组件,它将从GameObject销毁组件component。如果obj是GameObject它将销毁GameObject全部它的组件和GameObject全部transform子物体。实际物体的销毁总是延迟到当前更新循环后,但总是渲染之前完成。

DestroyImmediate():

该函数只在写编辑器代码时使用,因为延时的销毁永远不会在编辑模式下调用。在游戏代码推荐使用Object.Destroy代替。销毁总是延迟的(但在同一帧内执行),小心使用该函数,因为它能永久销毁资源。



这样我之前直接调用unity的Destroy()造成卡死的现象就可以解释了,因为延迟嘛,编辑模式不会调用.


现在最疑惑的是NGUITools.DestroyImmediate()和NGUITools.Destroy()这两个函数在封装的时候都做过判断,所以在编辑模式下用NGUITools.Destroy()是OK的;但是在手机中用NGUITools.DestroyImmediate()就不行.



总结我遇到的情况以及对应的解决方法;

NGUITools.DestroyImmediate()和NGUITools.Destroy()在编辑模式游戏都可以正常运行,NGUITools.DestroyImmediate()在安卓设备下游戏卡死.

解决:针对不同平台用不同的方法(主要根据手册中的编辑模式下用DestroyImmediate(),设备中用NGUITools.Destroy())


unity的DestroyImmediate()和Destroy(),编辑模式用Destroy()游戏会崩掉,所以用DestroyImmediate(),设备中也是用DestroyImmediate().


具体的原因还没有找到,希望有了解内情的可以告诉我!!!!!感激不尽!!

0 0
原创粉丝点击