2个版本

0.1.0 2020年12月28日
0.0.3 2021年3月28日
0.0.2 2021年1月31日
0.0.1 2021年1月30日

#1670 in 游戏开发

每月下载48

MIT/Apache

27KB
309

Rust

Distill

Distill是一个游戏资产管道,它从磁盘读取艺术家友好的格式,将它们处理成引擎就绪的格式,并将它们交付给游戏运行时。Distill处理资产之间的依赖关系,导入和构建缓存,开发过程中的跨设备热重载,为可发布游戏构建打包资产,等等。

愿景

创建一个开源的游戏资产处理的解决方案。

特性

该项目包含多个不同的组件,并且其中一些可以独立于其他组件使用。您可以以不同的方式组合它们,以适应您的流程。勾选符号表示功能支持 - 一些功能只是想法,尚未实现。

守护进程

守护进程监视文件系统事件,将源文件导入以生成资产,管理元数据和提供资产加载请求。它主要用于开发期间使用,但在适当的分布式游戏中也可以使用。守护进程非常高效,仅在文件更改或请求工作时分发。

资产UUID和依赖关系图

每个资产都通过在导入源文件时生成的16字节UUID进行标识。导入器还根据UUID生成资产构建和加载依赖项,这可以用来高效地遍历资产依赖关系图,而不需要接触文件系统。

源文件更改检测

守护进程监视文件系统更改,并确保仅在源文件更改时导入它们。元数据和哈希值在LMDB中本地索引并在.meta文件中进行版本控制。文件系统的修改时间和哈希值用于尽可能减少整个团队的重导入。

导入缓存

从源文件导入的资产通过其源文件内容和ID的哈希值进行缓存,避免了昂贵的解析和磁盘操作。

资产更改日志

资产元数据保存在LMDB事务数据库中。数据库的一致性保证和快照支持提供了一种方法,使用资产更改日志的资产更改来同步外部数据存储与资产元数据的当前状态。

元数据跟踪和缓存

当从源文件导入资产时,会生成元数据并将其存储在 `.meta` 文件中,与源文件一起,同时也在数据库中进行缓存。请将它们与源文件一起提交到版本控制。

自信地移动和重命名源文件

由于元数据与源文件一起存储,并且使用 UUID 来标识单个资产,用户可以在不破坏资产之间的引用的情况下移动、重命名和与他人共享源文件。

引入自己的资产类型

此项目中不包含资产类型。您可以通过实现 `Importer` 特性并使用文件扩展名注册这些类型来定义自己的资产类型和源文件格式。守护进程将自动运行您注册扩展名的 `Importer`。所有资产类型都必须实现 `serde::Serialize` + `serde::Deserialize` + `TypeUuidDynamic` + `Send`。

RON 导入器 - *可选*

包含一个可选的导入器和 derive 宏,以简化使用 `serde` 将序列化的 Rust 类型作为源文件的使用。

类型定义

#[derive(Serialize, Deserialize, TypeUuid, SerdeImportable)]
#[uuid = "fab4249b-f95d-411d-a017-7549df090a4f"]
pub struct CustomAsset {
    pub cool_string: String,
    pub handle_from_path: Handle<crate::image::Image>,
    pub handle_from_uuid: Handle<crate::image::Image>,
}

custom_asset.ron:

{
    "fab4249b-f95d-411d-a017-7549df090a4f": 
    (
        cool_string: "thanks",
        // This references an asset from a file in the same directory called "amethyst.png"
        handle_from_path: "amethyst.png", 
        // This references an asset with a UUID (see associated .meta file for an asset's UUID)
        handle_from_uuid: "6c5ae1ad-ae30-471b-985b-7d017265f19f"
    )
}

Loader

Loader 模块加载资产及其依赖项,供用户实现的 AssetStorage 特性处理。Loader 支持可插拔的 LoaderIO 特性,用于自定义资产及其元数据的加载位置。

热重载

`LoaderIO` 的内置 `RpcIO` 实现与 `Daemon` 通信,并在资产发生变化时自动重新加载资产。

自动加载依赖项

当导入源文件并生成资产时,会收集资产的依赖项并将其保存为元数据。Loader 自动确保在加载资产之前加载依赖项,并在不再需要时卸载依赖项。

支持 Handles 的 `serde` 🎉💯

提供了一个可选的 Handle 类型,支持使用 `serde` 进行反序列化和序列化。Handles 可以反序列化为 UUID 或路径。

自动注册 Handle 依赖项 🎉💯

作为资产部分序列化的 Handle 引用将自动注册,并保证在依赖于该资产的资产加载之前,由 Loader 加载所引用的资产。这意味着资产中的 Handles 总是保证有效和已加载。

打包以分发

为了分发您的游戏,您可能希望将资产打包到包含足够元数据以便快速加载的文件中。CLI 支持将资产打包到 `PackfileIO` 实现支持的文件格式。

TODO

网络化工件缓存

可以使用网络化缓存服务器在整个团队中重用导入和构建的结果。

平台特定的构建

在构建资产时提供自定义构建参数,并为特定平台定制构建工件。

可扩展的构建管道

一旦从源文件中导入资产,构建系统旨在在函数式编程的纯函数意义上完全纯净。资产构建的输入在导入步骤中都是已知的和声明的。这种设计使得并行化和分布式构建成为可能。

搜索

可以在导入时生成搜索标签,并由 tantivy 自动索引,从而实现 超快的文本搜索。搜索索引通过订阅资产变更日志进行增量维护。

跨平台支持

该项目旨在通过 Loader 模块支持尽可能多的平台,而 Daemon 可能永远无法在没有稳定文件系统支持的平台(如 WASM)上运行。当前已知的支持平台

Linux/Mac/Windows: Loader + Daemon

iOS: Loader

示例

要运行

  • cdexamples/handle_integration
  • cargorun
  • 示例包含图像资源类型,所以请尝试在 assets 文件夹中放入一些图像(png、jpg、tga)!

请查看 .meta 文件,这些文件位于 assets 文件夹中!

参与其中

此项目主要被 Amethyst 使用,并且开发相关的日常交流发生在 Amethyst Discord 服务器 的 #engine-general 频道中。随时加入聊天。欢迎贡献或提问!

贡献

除非你明确表示,否则根据 Apache-2.0 许可证定义的,你提交的任何有意包含在作品中的贡献,都应如上所述双重许可,没有任何额外的条款或条件。

请参阅 LICENSE-APACHELICENSE-MIT

许可证

根据以下任一许可证许可

由你选择。

请注意,某些依赖项可能受其他条款许可。这些在 deny.toml 中的 licenses.exceptions 下以最佳努力为基础列出,并在每次 CI 运行中使用 cargo-deny 进行验证。

依赖项

~10–20MB
~287K SLoC