3个版本
新版本 0.1.2 | 2024年8月18日 |
---|---|
0.1.1 | 2024年8月9日 |
0.1.0 | 2024年8月7日 |
#126 in 过程宏
每月 190 次下载
35KB
437 行
wasset
该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 - 在相关类型上实现了
Pod
和Zeroable
属性。 - encode - 允许将资产文件夹序列化到内存中。
- encode_macro - 提供了一个泛型宏,当实例化时,会将资产文件夹嵌入到一个 WASM 模块中。
- parse - 提供了读取 WASM 模块资产的能力。
- relative_path - (需要夜间构建)使
encode_macro
使用相对路径而不是项目根目录的路径。
依赖项
~1–2.5MB
~51K SLoC