#assets #hot-reloading #game-assets #cache #resources #load-file

assets_manager

方便地加载、缓存和重新加载外部资源

44 个版本

0.12.0 2024年7月3日
0.11.5 2024年4月15日
0.11.4 2024年3月20日
0.11.0 2023年12月30日
0.1.3 2020年3月23日

#28缓存

Download history 243/week @ 2024-05-03 178/week @ 2024-05-10 339/week @ 2024-05-17 606/week @ 2024-05-24 195/week @ 2024-05-31 180/week @ 2024-06-07 171/week @ 2024-06-14 158/week @ 2024-06-21 294/week @ 2024-06-28 379/week @ 2024-07-05 175/week @ 2024-07-12 135/week @ 2024-07-19 235/week @ 2024-07-26 164/week @ 2024-08-02 174/week @ 2024-08-09 120/week @ 2024-08-16

723 每月下载
用于 8 个crate (7 个直接)

MIT/Apache

245KB
5.5K SLoC

资产管理系统

Crates.io Docs.rs Minimum rustc version

这个crate旨在提供文件系统抽象,以便轻松加载外部资源。最初是为游戏设计的,但当然也可以在其他环境中使用。

最初的想法受到了Veloren的资产系统的启发。

这个crate遵循semver约定,并支持rustc 1.71及以上版本。更改此版本被认为是破坏性的更改。

目标

这个crate专注于

  • 良好的性能:
    对于性能导向的应用程序(如游戏)至关重要。
    加载的资产被缓存,因此加载多次与加载一次一样快。这个crate是为了与并发一起使用而设计的。

  • 热重载:
    热重载意味着在相应文件更改时立即更新内存中的资产,而无需重新启动程序。这可能极大地简化了开发过程。
    您的时间很宝贵,对热重载的一流支持可以帮助您节省时间。

  • 易于使用:
    良好的文档化的高级API,易于学习。
    内置对常见格式的支持:序列化、图像、声音。
    可以从文件系统、zip存档甚至嵌入到二进制文件中加载资源。

  • 轻量级:
    取之有道,无依赖性膨胀。

示例

假设您有一个文件 assets/common/position.ron,它包含以下内容

Point(
    x: 5,
    y: -6,
)

然后您可以这样加载它(启用ron功能)

use assets_manager::{Asset, AssetCache, loader};
use serde::Deserialize;

// The struct you want to load
#[derive(Deserialize)]
struct Point {
    x: i32,
    y: i32,
}

// Specify how you want the structure to be loaded
impl Asset for Point {
    // The extension of the files to look into
    const EXTENSION: &'static str = "ron";

    // The serialization format (RON)
    type Loader = loader::RonLoader;
}


// Create a new cache to load assets under the "./assets" folder
let cache = AssetCache::new("assets")?;

// Get a handle on the asset
// This will load the file `./assets/common/position.ron`
let handle = cache.load::<Point>("common.position")?;

// Lock the asset for reading
// Any number of read locks can exist at the same time,
// but none can exist when the asset is reloaded
let point = handle.read();

// The asset is now ready to be used
assert_eq!(point.x, 5);
assert_eq!(point.y, -6);

// Loading the same asset retrieves it from the cache
let other_handle = cache.load("common.position")?;
assert!(std::ptr::eq(handle, other_handle));

热重载也很容易使用

let cache = AssetCache::new("assets")?;
let handle = cache.load::<Point>("common.position")?;

loop {
    // Reload all cached files that changed
    cache.hot_reload();

    // Assets are updated without any further work
    println!("Current value: {:?}", handle.read());
}

许可

以下任一许可下获得许可

根据您的选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在本作品中的任何贡献,将如上双授权,不附加任何额外的条款或条件。

依赖项

~1–11MB
~112K SLoC