Closed xushunwang closed 11 months ago
AssetOperationHandle.Release最终调用到ProviderBase.ReleaseHandle
但是里面只是把引用计数减一下。真的资源释放还得后续通过ResourcePackage.UnloadUnusedAssets来统一释放(bundle多的时候耗时慢)
希望提供一个releaseIfZero参数,可以在引用计数到0的时候,立即释放这个资源依赖的bundle
Bunlde释放需要满足2个条件,一是内部的provider引用计数全部为0,二是无其它AB依赖该bundle。而handle的release只是释放其中一个provider的引用计数。另外ResourcePackage.UnloadUnusedAssets理论上耗时并不严重。
AssetOperationHandle.Release最终调用到ProviderBase.ReleaseHandle 但是里面只是把引用计数减一下。真的资源释放还得后续通过ResourcePackage.UnloadUnusedAssets来统一释放(bundle多的时候耗时慢) 希望提供一个releaseIfZero参数,可以在引用计数到0的时候,立即释放这个资源依赖的bundle
Bunlde释放需要满足2个条件,一是内部的provider引用计数全部为0,二是无其它AB依赖该bundle。而handle的release只是释放其中一个provider的引用计数。另外ResourcePackage.UnloadUnusedAssets理论上耗时并不严重。
单独把ResourcePackage.UnloadUnusedAssets放在一个转场界面确实耗时不算多。但是我有一个无缝加载的大地图,玩家会一直停留在这个场景,场景拖动会不停加载卸载资源。如果每次都在卸载一个资源的时候调用ResourcePackage.UnloadUnusedAssets来释放就耗时太大了。所以需要精准的反向找到这个address对应的provider和bundle进行释放速度快。
建议可以折冲一下,我们自己实现的资源管理器会当引用计数==0时放到一个Release Queue里面,然后在另一个比较慢的循环内定时Dequeue检查refCount是否==0, 再最终释放,这样就可以平衡两者,而且可以控制每次慢循环的遍历个数。
我看下是否能提供一个卸载某个指定bundle的检测方法。
另外一种方案是,业务层自己实现一个带缓存的LRU队列。避免频繁的释放和加载资源造成IO浪费。
AssetOperationHandle.Release最终调用到ProviderBase.ReleaseHandle
但是里面只是把引用计数减一下。真的资源释放还得后续通过ResourcePackage.UnloadUnusedAssets来统一释放(bundle多的时候耗时慢)
希望提供一个releaseIfZero参数,可以在引用计数到0的时候,立即释放这个资源依赖的bundle