Editor模式,使用AssetDatabase加载。
Runtime模式,使用AssetBundle加载。
任何情况下,都不使用Resources API。

实现细节

使用AssetHandle封装加载、卸载细节,通过轮询机制,管理运行时依赖和异步加载。

AssetHandle实现接口IRefCounter,通过引用计数(rc)来管理资源的自动卸载。

资源卸载

一般来说,有两种资源卸载方案。本资源框架,采用第二项。

  1. AssetBundle.Unload(false) + Resources.UnloadUnusedAssets,清理掉所有资源,非常耗,一般在切场景才会使用。
  2. 基于rc的资源管理方案,可实时卸载rc=0的资源,也可以切换场景时,卸载全部rc=0的资源。

1. 基于场景的资源卸载

在处理大量资源的游戏时,移动端中低端机型容易爆内存,游戏闪退,特别是切换场景时。优势也比较明显,管理方便,且场景时,调用几个接口即可。

2. 基于rc的资源卸载

优势就是,即用即加载,不用则卸载,内存可以控制在相对较好的水平。缺点也很明显,需要管理rc,管理不当,资源无法卸载,则优势减少,当资源对象生命周期不可控时,管理难度上升。官方推出的Addressable也是基于rc。

rc半自动化

手动控制rc,会比较繁琐,各个资源对象生命周期不确定的话,将会更难管理。针对以上难点,设计了一套加载接口IAssetLoader。

  • 每个子对象持有一个AssetLoader,AssetLoader内部缓存已经加载过的资源对象,并且只会将加载过的资源rc+1,当子对象生命周期结束时,会自动将所有加载的资源rc-1。
  • 如果一个对象只会加载一个资源,则直接持有AssetHandle即可,根据对象生命周期修正rc。

从Gameplay框架层面去封装资源的加载/卸载。例如对象池这种,也会有个IAssetLoader对象,对象池通过IAssetLoader加载资源,对象池清理时,也会直接释放掉IAssetLoader加载的资源。

rc调试面板(运行时)

引用调试面板