3个版本

新版本 0.1.2 2024年8月18日
0.1.1 2024年8月9日
0.1.0 2024年8月7日

#126 in 过程宏

Download history 144/week @ 2024-08-03 46/week @ 2024-08-10

每月 190 次下载

MIT/Apache

35KB
437

wasset

Crates.io Docs.rs

该crate允许将外部资产文件(文本、图像、模型)嵌入WASM插件。这些资产存储在WASM模块的自定义数据部分。这允许在主机上使用WassetParser读取资产。WASM模块本身可以通过宏生成的ID引用其资产。

wasset旨在作为游戏资产系统的基石。与使用include_bytes!()将资产包含在内的方法不同,以下方面

  • 主机可以在不加载WASM本身的情况下读取WASM模块的资产。这使得游戏引擎可以在实例化WASM模块之前预加载或懒加载所有资产。
  • 不同的WASM模块可以通过WassetId引用和共享资产。
  • 因为资产存储在自定义部分,所以在实例化WASM模块时,不需要将所有资产加载到内存中。这可以节省WASM模块包含许多资产时的内存。

使用方法

wasset没有定义资产格式 - 相反,它提供了将用户指定的资产类型加载和存储到WASM的方法。因此,设置wasset需要

  • 定义一个可以被serde序列化和反序列化的AssetSchema类型
  • 实现AssetEncoder以确定如何将文件转换为资产
  • 导出适当的资产编码器类型到wasset::include_assets::<A: AssetEncoder>

这里有一个完整的示例。一旦定义了资产类型和宏,就可以从WASM内部使用它们,如下所示

use wasset::*;
use wasset_example_macro::*;

// Load all assets from the given folder. This is the
// macro defined for a specific `AssetEncoder`.
include_assets!("wasset_example/wasset_example_module/assets");

/// Gets a list of all assets from this module.
pub fn list_all_assets() -> &'static [WassetId] {
    &[
        // The macro has defined these for us.
        assets::SOME_BINARY,
        assets::SOME_TEXT,
        assets::submodule::MORE_TEXT
    ]
}

然后,可以从主机检查这个WASM插件的资产数据

use wasset::*;
use wasset_example_schema::*;

fn main() {
    // Create a parser from the bytes of the WASM module.
    let parser = WassetParser::<ExampleAsset>::parse(EXAMPLE_PLUGIN_WASM).unwrap();
    for (id, asset) in &parser {
        println!("{id:?} | {asset:?}");

        // Prints something like:
        // WassetId(9ee64711-8e7e-4e40-a1bc-f13a1b4e5bdb) | Ok(Binary([97, 115, 106, 100]))
        // WassetId(b230fb86-8bf6-49a0-94f9-624386204129) | Ok(Text("Even more!"))
        // WassetId(ae189ff9-b0d4-48fc-b0e1-3093d53bff85) | Ok(Text("Hello world!"))
    }
}

可选功能

  • bytemuck - 在相关类型上实现了 PodZeroable 属性。
  • encode - 允许将资产文件夹序列化到内存中。
  • encode_macro - 提供了一个泛型宏,当实例化时,会将资产文件夹嵌入到一个 WASM 模块中。
  • parse - 提供了读取 WASM 模块资产的能力。
  • relative_path - (需要夜间构建)使 encode_macro 使用相对路径而不是项目根目录的路径。

依赖项

~1–2.5MB
~51K SLoC