今天写代码的时候,遇到了个需求,需要删除一个对象,然后同一帧中创建一个新的同名对象,直接使用Destory方法,删除的话,由于我做了对象缓存,并且删除再OnDestory中进行的缓存清理,所以会导致创建失败,需要创建的对象已存在(设定了同名对象即为同一个,不可创建),这时候,就要讨论下Destory()和DestroyImmediate()的一些区别

----------------------------------------------------------废话说完,说正文-----------------------------------------------

1   Destroy是异步删除,调用之后游戏物体并不会立即被删除,可以理解为,只是将他标记为需要删除,并不会马上删除和清理缓存,会在当前帧结束时,将所有标记为需要删除的对象,进行删除和缓存清理,它是异步执行的,不会影响主线程的执行,并且更加节省性能

2  DestroyImmediate,是立即删除游戏物体,游戏物体立即被删除,并清除缓存,代码顺序执行,影响主线程的执行

这些都是比较容易查到的信息,不是我要说的重点,我这边需要说的坑是其他的一些细节:

1.使用Destory()和DestroyImmediate()时,OnDestory的调用时机,有什么区别

 从官方给的Unity生命周期看,OnDestory是在每帧的最后调用的,但是实际上,这边显示的OnDestory是使用Destory()方法删除对象,的调用时机,如果使用DestroyImmediate()方法,经过我的测试,是实时调用的,即调用了DestroyImmediate()方法后,会立即调用被删除对象的OnDestory()方法

2.为什么推荐使用Destory而不是DestroyImmediate

使用DestroyImmediate实时删除对象和清除缓存,会导致主线程卡顿,也就是游戏卡顿,并且每次都是单次调用,会导致消耗更多的资源,因为准备清除缓存和缓存清除之后的过程,都是需要消耗资源的,可以理解为DrawCall,优化性能的其中一个方式就是,将小量多次的DrawCall,通过合并贴图的方式,变成一次较大量的DrawCall,Destory的销毁方式也是类似的操作,将当前帧需要删除的对象,都标记好,在当前帧结束时统一删除,并且是异步的,不影响主线程,只是占用少量性能,比较DestroyImmediate,会节省大量性能

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。