tuyoogame / YooAsset

unity3d resources management system
https://www.yooasset.com/
Apache License 2.0
2.38k stars 467 forks source link

AssetOperationHandle.Release希望提供releaseIfZero的参数 #181

Closed xushunwang closed 11 months ago

xushunwang commented 11 months ago

AssetOperationHandle.Release最终调用到ProviderBase.ReleaseHandle V0EM ~X9HJ3II40U H5UM{8

但是里面只是把引用计数减一下。真的资源释放还得后续通过ResourcePackage.UnloadUnusedAssets来统一释放(bundle多的时候耗时慢)

希望提供一个releaseIfZero参数,可以在引用计数到0的时候,立即释放这个资源依赖的bundle

gmhevinci commented 11 months ago

AssetOperationHandle.Release最终调用到ProviderBase.ReleaseHandle V0EM ~X9HJ3II40U H5UM{8

但是里面只是把引用计数减一下。真的资源释放还得后续通过ResourcePackage.UnloadUnusedAssets来统一释放(bundle多的时候耗时慢)

希望提供一个releaseIfZero参数,可以在引用计数到0的时候,立即释放这个资源依赖的bundle

Bunlde释放需要满足2个条件,一是内部的provider引用计数全部为0,二是无其它AB依赖该bundle。而handle的release只是释放其中一个provider的引用计数。另外ResourcePackage.UnloadUnusedAssets理论上耗时并不严重。

xushunwang commented 11 months ago

AssetOperationHandle.Release最终调用到ProviderBase.ReleaseHandle V0EM ~X9HJ3II40U H5UM{8 但是里面只是把引用计数减一下。真的资源释放还得后续通过ResourcePackage.UnloadUnusedAssets来统一释放(bundle多的时候耗时慢) 希望提供一个releaseIfZero参数,可以在引用计数到0的时候,立即释放这个资源依赖的bundle

Bunlde释放需要满足2个条件,一是内部的provider引用计数全部为0,二是无其它AB依赖该bundle。而handle的release只是释放其中一个provider的引用计数。另外ResourcePackage.UnloadUnusedAssets理论上耗时并不严重。

单独把ResourcePackage.UnloadUnusedAssets放在一个转场界面确实耗时不算多。但是我有一个无缝加载的大地图,玩家会一直停留在这个场景,场景拖动会不停加载卸载资源。如果每次都在卸载一个资源的时候调用ResourcePackage.UnloadUnusedAssets来释放就耗时太大了。所以需要精准的反向找到这个address对应的provider和bundle进行释放速度快。

c3076802 commented 11 months ago

建议可以折冲一下,我们自己实现的资源管理器会当引用计数==0时放到一个Release Queue里面,然后在另一个比较慢的循环内定时Dequeue检查refCount是否==0, 再最终释放,这样就可以平衡两者,而且可以控制每次慢循环的遍历个数。

gmhevinci commented 11 months ago

我看下是否能提供一个卸载某个指定bundle的检测方法。

gmhevinci commented 11 months ago

另外一种方案是,业务层自己实现一个带缓存的LRU队列。避免频繁的释放和加载资源造成IO浪费。

gmhevinci commented 11 months ago

下个版本可用 https://github.com/tuyoogame/YooAsset/commit/194afe435ae761a9d3b8bee4c5268afbca6665d9