#webp #animation #bevy #video

bevy_webp_anim

用于在 bevy 中加载和播放动画 webp 图像的插件

5 个版本 (3 个破坏性更新)

0.4.0 2024年7月5日
0.3.1 2024年2月21日
0.3.0 2024年2月17日
0.2.0 2024年1月11日
0.1.0 2024年1月3日

#916 in 游戏开发

Download history 1/week @ 2024-06-04 129/week @ 2024-07-02 10/week @ 2024-07-09

每月139次下载

MIT/Apache

37KB
291

bevy_webp_anim

Docs crates.io

bevy 中加载和播放动画 .webp 图像的插件。我们假设使用提供的 WebpLoader 加载的任何 webp 文件都是动画。帧的实际解码由 image 包处理。

解码在 tokio::runtime::Runtime 线程池中运行。资源 WebpAnimator 持有一个从视频 uuid 到通道接收器的映射。运行时将 bevy::Image 帧发送到通道接收器。

注册系统 load_next_frame 以自动继续动画。该系统与核心组件 RemoteControl 一起工作。该组件包含视频的 uuid 和 FPS 设置。通过在 Update 或与视频 FPS 匹配的固定时间表上运行 load_next_frame 系统等,每个 RemoteControl 组件将加载视频的下一帧到实体的 Handle<Image>。如果实体没有 Handle<Image> 组件,则丢弃该帧。

示例

$ cargo run --example basic 为兔子运行。

问题:支持大视频

当前 bevy_webp_anim 的实现将每个帧加载到内存中。然后,它通过循环将帧向量中的帧发送到通道接收器。这适用于我的用例,因为我的视频很小,我想循环播放。

然而,另一种方法将便于处理更大的视频。我们可以存储解码器(来自 image 包)并在需要时解码帧。目前实施此方法的麻烦在于,启动异步任务需要 Send 期货。然而,image 包中的 Frames<'a> 迭代器有一个内部的 Box<dyn Iterator<Item = Frame<'a>> + 'a> 类型。我们不能在 .await 点之间保持迭代器,这些点位于我们的通道发送者 async fn send 调用中。

特性:重用解码帧

我们可以让多个实体监听相同的视频帧。如果你想在屏幕的多个位置播放相同的视频,这将很有用。目前,你需要分别的解码器和分别的 Handle<Image>

目前我项目中不需要这个特性,但如果有人需要,我很乐意添加。

问题:探索使用 bevy 的工作负载系统而不是自定义的 tokio 运行时

Bevy 自带线程池可以运行任务。可能最好使用这个而不是启动另一个 tokio 运行时。

依赖关系

~39–77MB
~1.5M SLoC