34 个版本
0.14.2 | 2024 年 7 月 15 日 |
---|---|
0.13.6 | 2024 年 4 月 23 日 |
0.13.5 | 2024 年 2 月 22 日 |
0.13.4 | 2023 年 9 月 15 日 |
0.7.5 | 2022 年 6 月 30 日 |
11 在 #pi 类别中排名 11
每月 486 次下载
在 2 个 crate 中使用 (通过 pi_store)
62KB
1.5K SLoC
在了解总资产管理器之前,我们需要先达成一个共识,即:所有的资源,都可以按照如下两种方式划分:
- 可按照是否正在使用,分为正在使用的资源(UsingAsset)和未使用的资源(UnusedAsset)
- 可按照类别是否相同,分为图片(Image)、视频(Video)、音频(Audio)、UI 纹理(UiTexture)、3D 纹理(3DTexture)等。
资产管理器实现的核心宗旨,是保证应用内的所有资源尽量不超过指定的总大小。具体来说,即:当所有资源 的总大小超过指定总大小时,资产管理器会自动释放部分未使用的资源,以保证总大小不超过指定总大小。这个目标听起来似乎很简单,但要兼顾资产管理器的性能,程序的可维护性,我们需要做更复杂的事情。
以 UI 纹理(UiTexture)、3D 纹理(3DTexture)为例。假定资产管理器中只存在 UiTexture、3DTexture 两类资源,资产管理器配置的总容量配置为 200MB,当前资产管理器管理的 UiTexture 有 200MB,其中有 30MB 是正在使用,另外 170MB 是未被使用,此时,在应用中打开 3D 场景,需要在资产管理器中加载 30MB 的 3DTexture,我们希望能将 UiTexture 中未使用的 170MB 的部分(30MB)丢弃,以使得资源总量尽量维持在 200MB 以内。一个简单的做法是,往资产管理器中 push 任何一个资源,都关心所有类别的自资源持有情况,即在 push 3D 资源时,要判断 UiTexture 的持有情况,如果 UiTexture 的持有情况满足释放条件,则释放 UiTexture,然后再 push 3D 资源。但是,如果不止存在两种类别的资源,假设有 30 种资源类别,最坏的情况,我们需要判断 30 次,才能确定应该释放哪个资源或者无资源可释放
资管管理器已经考虑过以下情形,并针对这些情形制定了 围绕资产管理器核心宗旨 的 相对合理的解决方案,我们以 UI 纹理(UiTexture)、3D 纹理(3DTexture)为例,来解释一下资管管理器是如何应对这些情形的。
假定资产管理器中只存在 UiTexture、3DTexture 两类为例,资产管理器配置的总容量为 200MB:
情形 1
情形描述:当前资产管理器管理的 UiTexture 有 200MB,其中有 30MB 是正在使用,另外 170MB 是未被使用,此时,在应用中打开 3D 场景,需要在资产管理器中加载 30MB 的 3DTexture 应对方法:将 UiTexture 中未使用的 170MB 的部分丢弃,以使得资源总量尽量维持在 200MB 以内
情形 2
情形描述:假定当前资产管理器管理的 UiTexture 有 200MB,其中有 30MB 是正在使用,另外 170MB 是未被使用,此时,在应用中打开 3D 场景,需要在资产管理器中加载 30MB 的 3DTexture 应对方法:将 UiTexture 中未使用的 170MB 的部分丢弃,以使得资源总量尽量维持在 200MB 以内
依赖项
~7–37MB
~528K SLoC