Bevy 0.19 官方发布博文摘要
Bevy 0.19 于 2026-06-19 正式发布,由 261 位贡献者、1185 个 PR 共同完成。 本文是官方发布公告的深度摘要,覆盖全部 20+ 核心章节。
核心数据
- 发布日期:2026-06-19
- 贡献者:261 人
- PR 总量:1185
- crates.io 版本:
0.19.0 - 迁移指南:0.18 → 0.19 Migration Guide
章节索引
| # | 特性 | 作者 | 关键 PR | 相关 Wiki |
|---|---|---|---|---|
| 1 | [[bsn | Next Generation Scenes (BSN)]] | cart | #23413, #23880, #23808, #23905, #24008 |
| 2 | Render Big Scenes Faster | pcwalton, aevyrie, tychedelia | 18 PRs | bevy-rendering |
| 3 | Solari Improvements | JMS55, dylansechet | 11 PRs | bevy-solari-pathtracer |
| 4 | More Feathers Widgets | viridia, jordanhalase | 15 PRs | — |
| 5 | Text Input | ickshonpe, Zeophlite, alice-i-cecile, chronicl | 15 PRs | — |
| 6 | Contact Shadows | aevyrie | #22382 | bevy-pbr |
| 7 | Physically Based SSR | aevyrie | #22379 | bevy-pbr |
| 8 | Rectangular Area Lights | dylansechet | #23288 | bevy-pbr |
| 9 | Richer Text | ickshonpe, alice-i-cecile, gregcsokas | 5 PRs | — |
| 10 | App Settings | viridia, mpowell90 | 4 PRs | — |
| 11 | Post-Processing Effects | Breakdown-Dog | #22564, #23110 | — |
| 12 | Render Recovery | atlv24, kfc35 | 13 PRs | — |
| 13 | Render Graph as Systems | tychedelia | #22144 | bevy-rendering |
| 14 | Improved Skinned Mesh Culling | greeble-dev | #21837 | — |
| 15 | Parallax Corrected Cubemaps | pcwalton | #22582 | bevy-pbr |
| 16 | Partial Bindless | holg | #23436 | bevy-pbr |
| 17 | Diagnostics Overlay | hukasu, cart | #22486 | diagnostic-overlay |
| 18 | Contiguous Query Access (SIMD) | Jenya705 | #21984, #24181 | bevy-ecs-game-type-fit |
| 19 | Delayed Commands | Runi-c | #23090 | — |
| 20 | Text Gizmos | ickshonpe, nuts-rice | #22732, #23120 | — |
| 21 | Cancellable Web Tasks | NthTensor, Gingeh | #21795 | — |
| 22 | Asset Saving | andriyDev | #22622 | — |
| 23 | Resources as Components | Trashtalk217, cart, SpecificProtagonist | 9 PRs | — |
| 24 | Remote Entity Reservation | ElliottjPierce, alice-i-cecile, cart | #18670, #22658 | — |
| 25 | Interactive Transform Gizmo | jbuehler23, aevyrie | #23435 | — |
| 26 | Infinite Grid | IceSentry | #23482 | — |
| 27 | White Furnace Test | dylansechet | #23194, #23203 | bevy-pbr |
| 28 | Observer Run Conditions | jonas-meyer | #22602 | — |
| 29 | Serialize/Deserialize Asset Handles | andriyDev | #23329 | — |
| 30 | Self-Referential Relationships | mrchantey | #22269 | — |
| 31 | Accessible Label Component | viridia | #24308 | — |
1. Next Generation Scenes (BSN)
BSN(Bevy Scene Notation)是 0.19 的旗舰特性。通过 bsn! 宏在 Rust 代码中声明式定义场景,未来版本将支持 .bsn 资产文件。
关键要点:
bsn!本质上是组件清单,但支持场景函数、模板 patching、内联资产、事件观察等高级特性SceneComponentderive 让组件自带出厂配置(如@Player { score: 0 }自动展开子实体)- 0.19 暂不附带官方
.bsn资产加载器,专注代码驱动工作流
详见独立页面 bsn。
2. Render Big Scenes Faster
大规模场景渲染性能显著提升,方法论可概括为「更多 GPU 化、更多批处理、更多并行、更少内存访问」。
** benchmark 数据:**
| 场景 | 0.18 | 0.19 | 提升 |
|---|---|---|---|
| many_cubes 116K 视口 (RTX 4090 mobile) | 49.47ms (21 FPS) | 18.77ms (53 FPS) | 2.6x |
| many_cubes 1.6M 无裁剪 | 93.1ms | 41.2ms | 2.3x |
| bevy_city 静态 | 19.3ms | 11.8ms | 1.6x |
| bevy_city 动态 | 22.1ms | 16.2ms | 1.4x |
涉及 PR: GPU 预处理、自动批处理、并行提取、内存访问优化等 18 个 PR。
3. Solari Improvements
Solari(实时路径追踪渲染器)的改进包括:
- 镜面与非金属材质修复
- 性能优化
- 时间稳定性大幅提升
4. More Feathers Widgets
Feathers 新增控件:Text input、Number input、Dropdown menu、Disclosure toggle、Icon/label、Pane/subpane/group、List view、Scrollbar。
Feathers 已全面迁移到 BSN,相比旧的 spawn-function 方式大幅减少了样板代码。
示例对比(Before → After):
// 旧写法:children 用泛型参数传入,observer 单独 wiring
commands.spawn(checkbox_bundle(MyCheckbox, children![...])).observe(...);
// BSN:caption、组件、observer 一次性声明
bsn! {
@FeathersCheckbox { @caption: bsn! { Text("Enable shadows") } }
MyCheckbox
on(|change: On<ValueChange<bool>>| { ... })
}5. Text Input
EditableText 组件提供上游文本输入支持。MVP 功能清单:
- 键盘输入、光标导航(方向键/Home/End/单词级快捷键)
- 选择(Shift+方向/点击拖拽)、多击(双击选词/三击选行)
- Backspace/Delete(单字符/单词)、剪贴板集成
- Unicode 感知导航、双向文本、IME(CJK 输入法)
- 多行/软换行/垂直滚动、水平滚动
- 单字符过滤 (
EditableTextFilter)、可选全选聚焦 (SelectAllOnFocus)、最大字符限制
未实现: placeholder、undo-redo、password masking 等。
6. Contact Shadows
接触阴影(Screen-Space Contact Shadows)补充了传统 shadow map 的近距离缺陷。
原理: 从表面向光源方向执行短距离屏幕空间 raycast,检测附近遮挡物。
解决的经典问题:
- Peter-panning(物体看似”漂浮”)
- Shadow acne(自相交伪影)
- 高分辨率 shadow map 的内存瓶颈
使用方式: 灯光组件设置 contact_shadows_enabled = true,相机添加 ContactShadows 组件。
支持 directional / point / spot 三种光源。成本与”被照亮的像素数 × 启用的光源数”成正比。
7. Physically Based Screen Space Reflections
屏幕空间反射(SSR)升级为”基于物理”的算法,反射质量显著提升。
8. Rectangular Area Lights
矩形面光源,使用 Linearly Transformed Cosines(LTC)标准方法。
限制: 当前不投射阴影,不支持各向异性材质。
启用: area_light_luts Cargo feature。
9. Richer Text
文本系统从 cosmic_text 迁移到 parley,带来多项改进:
Better font selection
FontSource 三种字体指定方式:
FontSource::Handle(...)— 资产句柄FontSource::Family("...")— 字体家族名FontSource::Monospace等语义类别 — Serif/SansSerif/Cursive/Fantasy/Monospace/SystemUi/Emoji/Math
语义类别通过 FontCx resource 配置默认映射;启用 system_font_discovery feature 可加载系统已安装字体。
Variable font properties
TextFont 新增 weight、width、style 字段,支持可变字体(无需为每种字重准备独立字体文件)。
Responsive font sizing
font_size 从裸 f32 变为 FontSize 枚举,支持 CSS 式单位:
Px、Vw、Vh、VMin、VMax、RemRem值随RemSizeresource 缩放
Letter spacing
新增 LetterSpacing 组件控制字间距。
10. App Settings
官方通用应用设置框架,自动加载/保存设置到文件并暴露为 ECS resources。
使用模式:
#[derive(Resource, SettingsGroup, Reflect, Default)]
struct AudioSettings {
music_volume: f32,
sfx_volume: f32,
}
app.add_plugins(SettingsPlugin::new("com.example.mygame"));保存命令:SaveSettingsDeferred / SaveSettingsSync。
crate 名: bevy-settings(hyphenated),感谢 Andhrimnir (@tecbeast42) 让出 crates.io 名称。
11. More Post-Processing Effects
新增两个后处理效果:
Vignette — 边缘压暗,引导视觉焦点到画面中心。参数:intensity、radius、smoothness、roundness、center、edge_compensation、color。
Lens Distortion — 镜头畸变。正 intensity 为桶形畸变(barrel),负值为枕形畸变(pincushion)。
12. Render Recovery
GPU 错误恢复机制。此前 driver crash / OOM / device loss 会导致静默挂起或崩溃;现在以类型化错误暴露,由开发者决定处理策略。
策略选项:
Recover(default())— 重新初始化渲染器,保持应用运行(推荐处理DeviceLost)StopRendering— 停止渲染但保持应用存活(适合展示错误界面)Ignore— 静默吞掉(validation 错误的默认行为)panic!()— 内部错误(bug)仍应 panic
默认行为(未配置时): Vulkan validation errors 被忽略,其余发送 AppExit 优雅退出。
警告: 反复失败时的闪烁可能对光敏性癫痫构成风险,建议仔细测试。
13. Render Graph as Systems
渲染图架构被 ECS Schedule 取代。Render pass 现在是运行在 render world 上的普通系统(Core3d、Core2d schedule)。
变化:
- 旧:
impl Node+RenderLabel+ 专用 API 排序 - 新:
fn my_system(mut ctx: RenderContext)+.add_systems(Core3d, ...)
未来潜力: 只读 schedule 可强制命令编码并行化。
14. Improved Skinned Mesh Culling
蒙皮网格的裁剪现在基于实际关节位置计算 bounds,而非骨架 rest pose。
自动生效: glTF 加载的蒙皮网格无需改动。
手动配置: 对 handmade skinned mesh,调用 mesh.generate_skinned_mesh_bounds() 并添加 DynamicSkinnedMeshBounds。
15. Parallax Corrected Cubemaps
立方体贴图反射以前假设环境无限远;室内/密集场景中反射与几何错位。
修复: 每个反射探针获得自己的包围盒,raytrace 该盒确定正确的立方体贴图采样方向。自动应用于 light probe,使用探针的 influence bounding box 作为校正体积。
默认启用,可选关闭: ParallaxCorrection::None。
16. Partial Bindless / Reduced Bind Group Overhead
Bindless 渲染:着色器索引到共享纹理/缓冲池,而非每 draw call 重新绑定。
Metal 部分支持: WGPU Metal 后端仅支持纹理绑定数组,不支持缓冲绑定数组。历史上 Bevy 要求两者都支持才启用 bindless,导致 Metal 完全 excluded。
0.19 改变: 按材质实际需求检查。仅用纹理数组的材质(包括 StandardMaterial)可在 Metal 上走 fast path。
两个正确性修复:
- Sampler limit check 之前测错了指标(
max_samplers_per_shader_stage→max_binding_array_sampler_elements_per_shader_stage) - 跳过材质不用的资源类型,避免超出 Metal 31 argument buffer slot 限制
Bistro Exterior (698 材质) benchmark:
| GPU | 帧时间提升 | 内存 |
|---|---|---|
| Apple M2 Max (Metal) | +15% | −57 MB RAM |
| NVIDIA 5060 Ti | +46% | Same |
| AMD Vega 8 | Same | −88 MB VRAM |
| Intel i360P | +14% | Same |
| Intel Iris XE | Same | Same |
| ^[raw/articles/bevy-0-19-release-announcement-2026-06-19.md] |
17. Diagnostics Overlay
内置诊断覆盖层,默认显示 FPS / frame_time / frame_count。
commands.spawn(DiagnosticsOverlay::fps());
commands.spawn(DiagnosticsOverlay::mesh_and_standard_material());支持自定义 DiagnosticPath 列表、统计模式(smoothed / latest / raw)、浮点精度。
18. Contiguous Query Access (SIMD)
Query::contiguous_iter() / contiguous_iter_mut() 直接返回 table slice,让 LLVM 自动向量化或显式 SIMD。
benchmark(10,000 实体 position += velocity):
| 方法 | 时间 | AVX2 |
|---|---|---|
| 普通迭代 | 5.58 µs | 5.51 µs |
| Contiguous 迭代 | 4.88 µs | 1.87 µs |
| Contiguous + bypass change detection | 4.40 µs | 1.58 µs |
前提条件: 所有 fetched 组件用默认 table storage;filter 只能是 archetypal(With/Without),不能用 Changed/Added。
bypass_change_detection(): 若不需要变更检测,可获取原始 &mut [T],进一步提速。
19. Delayed Commands
延迟执行任意命令,无需手动管理 timer:
fn delayed_spawn(mut commands: Commands) {
commands.delayed().secs(1.0).spawn(DummyComponent);
}注意: 尚无内置取消机制。建议将 originating Entity 嵌入命令,若该实体被 despawn 则取消动作。
20. Text Gizmos
世界空间调试文本,内置 stroke font,仅支持 ASCII。与 Text2D(游戏内标签)区分,专用于开发工具。
gizmos.text_2d(Isometry2d::IDENTITY, "Hello Bevy", 40.0, Vec2::ZERO, Color::WHITE);21. Cancellable Web Tasks
Web 端 Task drop 现在真正取消底层 future。
历史问题: wasm_bindgen_futures::spawn_local 将 future 直接交给 JS 事件循环,无 handle 可取回,导致 Web 上 Task drop 只是丢弃 wrapper,工作继续泄漏运行。
修复: 使用 NthTensor 构建的 web-task crate,在 JS 事件循环上实现协作式取消(每个 yield 点检查 abort flag)。
22. Asset Saving
运行时保存资产到磁盘,通过 save_using_saver + AssetSaver 实现。
两步流程:
- 构建
SavedAsset(简单资产用SavedAsset::from_asset,含子资产用SavedAssetBuilder) - 调用
save_using_saver(asset_server, saver, path, saved_asset, settings).await
SavedAsset 采用 borrow 而非 own,可在同个 async block 中构建并保存。
23. Resources as Components
Resources 底层改为 singleton entity 上的 components,统一内部机制。
新增能力:
- Query 同时遍历 resources 和 components
- 对 resource entities 添加 relationships
- 对 resource entities 添加额外 components
- Resource 生命周期 observers / hooks
- 标记 resources 为 immutable
核心 PR: #20934, #22910, #22911, #22919, #22930, #23616, #23716, #24077, #24164。
24. Remote Entity Reservation
无需 World 引用即可从任意线程预留 entity IDs。
五阶段生命周期: unallocated → allocated → spawned → despawned → freed。
为未来的 “assets as entities” 工作铺路(后台准备实体内容时应用继续运行)。
25. Interactive Transform Gizmo
内置交互式变换小工具(平移/旋转/缩放)。
app.add_plugins(TransformGizmoPlugin);
commands.spawn((Camera3d::default(), TransformGizmoCamera));
commands.spawn((Mesh3d(mesh), TransformGizmoFocus));设计: 不与用户输入硬连接,保持可组合性。灵敏度、吸附、屏幕空间缩放通过 TransformGizmoSettings 配置;模式通过 TransformGizmoMode resource 控制。
上游自 bevy_transform_gizmo crate(Foresight Spatial Labs 贡献)。
26. Infinite Grid
全屏 shader 实现的无限地面网格,消除传统 mesh 绘制的天际线 aliasing 和 Moiré 图案。
use bevy::dev_tools::infinite_grid::{InfiniteGrid, InfiniteGridPlugin};
App::new()
.add_plugins((DefaultPlugins, InfiniteGridPlugin))
...
fn setup(mut commands: Commands) {
commands.spawn(InfiniteGrid);
}外观由 InfiniteGridSettings 控制(可放在 grid entity 或 camera 上 per-view 覆盖)。
上游自 bevy_infinite_grid crate(Foresight Spatial Labs 贡献)。
27. White Furnace Test
白炉测试(将完美反射物体置于均匀白色环境,应不可见)用于验证 PBR shader 能量守恒。
修复的两个 bug:
GeneratedEnvironmentMapLight在某些表面朝向下出现接缝- 部分金属材质吸收能量,显得过暗
Bevy 现在通过该测试。
28. Observer Run Conditions
Observer 现在支持 run_if:
app.add_observer(on_damage.run_if(|paused: Res<GamePaused>| !paused.0));适用于 add_observer、entity .observe()、Observer builder。
29. Serializing and Deserializing Asset Handles
资产句柄可在序列化/反序列化中往返。
实现: HandleSerializeProcessor 存储资产路径;HandleDeserializeProcessor 从路径重新加载。
要求: 资产必须从 #[derive(Asset, TypePath)] 改为 #[derive(Asset, Reflect)] #[reflect(Asset)]。
30. Self-Referential Relationships
默认情况下 Bevy 拒绝指向自身的 relationship(防止 ChildOf 等结构递归死循环)。
新增 allow_self_referential 属性,让纯语义关系(如 Likes(self))合法:
#[derive(Component)]
#[relationship(relationship_target = PeopleILike, allow_self_referential)]
pub struct LikedBy(pub Entity);31. Accessible Label Component
AccessibleLabel 组件将 a11y label 从 AccessibilityNode 大结构中分离,使其可作为 mixin 在 BSN 模板中使用(widget 使用者而非作者添加 label)。
内部通过 component hooks 同步到 AccessibilityNode。
What’s Next?(官方路线图)
| 特性 | 说明 |
|---|---|
.bsn scene format | 加载/保存 BSN 资产文件,供编辑器使用 |
| Unified 2D/3D rendering internals | 统一内部架构,保持 Sprite API 不变 |
| Entity inspector | 游戏内/编辑器内检查实体树 |
| Assets-as-entities | 资产系统迁入 ECS |
| WESL shader language | WGSL 扩展,计划将内部着色器移植到 WESL |
| 更完整的 Bevy Book | 在 0.20 周期发布大幅扩充的文档 |
相关页面
- bevy — Bevy 引擎主实体
- bsn — BSN 深度概念页
- bevy-pbr — PBR 渲染 crate
- bevy-rendering — 渲染系统概述
- diagnostic-overlay — 诊断覆盖层
- bevy-solari-pathtracer — Solari 路径追踪
- bevy-version-notes — 版本速览对比
- bevy-migration-notes — 升级迁移笔记
- bevy-game-development — Bevy 游戏开发实践
- bevy-blog-index — ZoOL 的 Bevy 博客文章索引