Unity | 资源释放底层原理

目录

一、Resource.UnloadAsset

二、YooAsset资源释放

三、Destory

四、OnDestroy


一、Resource.UnloadAsset

        Resource.UnloadAsset,可以用来卸载AB加载的asset,后续从AB加载新的asset也没问题,卸载依赖AB的asset也可以。并且发现一点,如果场景上有asset的引用,调用该接口并不会卸载asset,需要asset引用的实例对象都被销毁后再调用UnloadAsset接口才会卸载。(只会卸载特定的资源,而不会影响其他仍在使用的资源。)

        在Unity中,AssetBundle.Unload 方法用于卸载已经加载的AssetBundle资源。这个方法接受一个布尔参数,该参数决定是否卸载AssetBundle中包含的所有对象。

  • 当调用 AssetBundle.Unload(true) 时,这意味着想要卸载AssetBundle以及它所包含的所有资源。这包括任何已经从AssetBundle中加载的资源,如纹理、模型、音频等。使用这个方法时要非常小心,因为如果有其他地方还在引用这些资源,那么这些引用将会变成空引用,可能导致运行时错误或者异常行为。
  • 在调用 AssetBundle.Unload(false) 时,AssetBundle的内存将会被释放,但是实际的资源,比如从AssetBundle中加载的游戏对象和纹理等,不会被卸载。

二、YooAsset资源释放

void LoadAsset()
{    var res = package.LoadAssetAsync<GameObject>("RaceResultAward");
    res.Completed += (handle) =>
    {
        resultAward = Instantiate((GameObject)handle.AssetObject, RaceGameManager._instance.playerParent);
    
        handle.Release();
    }
}
void Clear()
{
    package.UnloadUnusedAssets();
    package.ClearUnusedCacheFilesAsync();
}
  • release:减少引用计数
  • package.UnloadUnusedAssets:资源回收(卸载引用计数为零的资源)。该方法底层就是调了AssetBundle.Unload(true) 。
  • ClearUnusedCacheFilesAsync:清理包裹未使用的缓存文件

        所以,我们要自己维护handle的生命周期,不用了再去释放。否则release后引用计数为0了,此时立即调用package.UnloadUnusedAssets()会有问题。

三、Destory

        Destory真正销毁是在一帧后,需要等一帧再执行Resources.UnloadUnusedAssets,通常是用协程实现, yield return new WaitForEndOfFrame();(不等这一帧,GameObject还在,是无论如何都不会让你销毁的。)官方参考是这样说的:

        The object obj will be destroyed now or if a time is specified t seconds from now. If obj is a Component it will remove the component from the GameObject and destroy it. If obj is a GameObject it will destroy the GameObject, all its components and all transform children of the GameObject. Actual object destruction is always delayed until after the current Update loop, but will always be done before rendering。

四、OnDestroy

        物体隐藏时,OnDestroy不会被调用。

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值