#assets #cache #pi

pi_assets

资产管理器,异步加载资源,多个管理器的容量统一管理

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

Download history 185/week @ 2024-04-21 24/week @ 2024-04-28 16/week @ 2024-05-05 1/week @ 2024-05-12 7/week @ 2024-05-19 5/week @ 2024-06-02 6/week @ 2024-06-09 7/week @ 2024-06-16 1/week @ 2024-06-23 119/week @ 2024-06-30 265/week @ 2024-07-07 164/week @ 2024-07-14 1/week @ 2024-07-21 51/week @ 2024-07-28

每月 486 次下载
2 个 crate 中使用 (通过 pi_store)

MIT/Apache 协议

62KB
1.5K SLoC

在了解总资产管理器之前,我们需要先达成一个共识,即:所有的资源,都可以按照如下两种方式划分:

  1. 可按照是否正在使用,分为正在使用的资源(UsingAsset)和未使用的资源(UnusedAsset)
  2. 可按照类别是否相同,分为图片(Image)、视频(Video)、音频(Audio)、UI 纹理(UiTexture)、3D 纹理(3DTexture)等。

资产管理器实现的核心宗旨,是保证应用内的所有资源尽量不超过指定的总大小。具体来说,即:当所有资源 的总大小超过指定总大小时,资产管理器会自动释放部分未使用的资源,以保证总大小不超过指定总大小。这个目标听起来似乎很简单,但要兼顾资产管理器的性能,程序的可维护性,我们需要做更复杂的事情。

以 UI 纹理(UiTexture)、3D 纹理(3DTexture)为例。假定资产管理器中只存在 UiTexture3DTexture 两类资源,资产管理器配置的总容量配置为 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)为例,来解释一下资管管理器是如何应对这些情形的。

假定资产管理器中只存在 UiTexture3DTexture 两类为例,资产管理器配置的总容量为 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