Bevy 0.19 官方发布博文摘要

Bevy 0.19 于 2026-06-19 正式发布,由 261 位贡献者、1185 个 PR 共同完成。 本文是官方发布公告的深度摘要,覆盖全部 20+ 核心章节。

核心数据

章节索引

#特性作者关键 PR相关 Wiki
1[[bsnNext Generation Scenes (BSN)]]cart#23413, #23880, #23808, #23905, #24008
2Render Big Scenes Fasterpcwalton, aevyrie, tychedelia18 PRsbevy-rendering
3Solari ImprovementsJMS55, dylansechet11 PRsbevy-solari-pathtracer
4More Feathers Widgetsviridia, jordanhalase15 PRs
5Text Inputickshonpe, Zeophlite, alice-i-cecile, chronicl15 PRs
6Contact Shadowsaevyrie#22382bevy-pbr
7Physically Based SSRaevyrie#22379bevy-pbr
8Rectangular Area Lightsdylansechet#23288bevy-pbr
9Richer Textickshonpe, alice-i-cecile, gregcsokas5 PRs
10App Settingsviridia, mpowell904 PRs
11Post-Processing EffectsBreakdown-Dog#22564, #23110
12Render Recoveryatlv24, kfc3513 PRs
13Render Graph as Systemstychedelia#22144bevy-rendering
14Improved Skinned Mesh Cullinggreeble-dev#21837
15Parallax Corrected Cubemapspcwalton#22582bevy-pbr
16Partial Bindlessholg#23436bevy-pbr
17Diagnostics Overlayhukasu, cart#22486diagnostic-overlay
18Contiguous Query Access (SIMD)Jenya705#21984, #24181bevy-ecs-game-type-fit
19Delayed CommandsRuni-c#23090
20Text Gizmosickshonpe, nuts-rice#22732, #23120
21Cancellable Web TasksNthTensor, Gingeh#21795
22Asset SavingandriyDev#22622
23Resources as ComponentsTrashtalk217, cart, SpecificProtagonist9 PRs
24Remote Entity ReservationElliottjPierce, alice-i-cecile, cart#18670, #22658
25Interactive Transform Gizmojbuehler23, aevyrie#23435
26Infinite GridIceSentry#23482
27White Furnace Testdylansechet#23194, #23203bevy-pbr
28Observer Run Conditionsjonas-meyer#22602
29Serialize/Deserialize Asset HandlesandriyDev#23329
30Self-Referential Relationshipsmrchantey#22269
31Accessible Label Componentviridia#24308

1. Next Generation Scenes (BSN)

BSN(Bevy Scene Notation)是 0.19 的旗舰特性。通过 bsn! 宏在 Rust 代码中声明式定义场景,未来版本将支持 .bsn 资产文件。

关键要点:

  • bsn! 本质上是组件清单,但支持场景函数、模板 patching、内联资产、事件观察等高级特性
  • SceneComponent derive 让组件自带出厂配置(如 @Player { score: 0 } 自动展开子实体)
  • 0.19 暂不附带官方 .bsn 资产加载器,专注代码驱动工作流

详见独立页面 bsn

2. Render Big Scenes Faster

大规模场景渲染性能显著提升,方法论可概括为「更多 GPU 化、更多批处理、更多并行、更少内存访问」。

** benchmark 数据:**

场景0.180.19提升
many_cubes 116K 视口 (RTX 4090 mobile)49.47ms (21 FPS)18.77ms (53 FPS)2.6x
many_cubes 1.6M 无裁剪93.1ms41.2ms2.3x
bevy_city 静态19.3ms11.8ms1.6x
bevy_city 动态22.1ms16.2ms1.4x

涉及 PR: GPU 预处理、自动批处理、并行提取、内存访问优化等 18 个 PR。

3. Solari Improvements

Solari(实时路径追踪渲染器)的改进包括:

  • 镜面与非金属材质修复
  • 性能优化
  • 时间稳定性大幅提升

详见 bevy-solari-pathtracer

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 新增 weightwidthstyle 字段,支持可变字体(无需为每种字重准备独立字体文件)。

Responsive font sizing

font_size 从裸 f32 变为 FontSize 枚举,支持 CSS 式单位:

  • PxVwVhVMinVMaxRem
  • Rem 值随 RemSize resource 缩放

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 上的普通系统(Core3dCore2d 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。

两个正确性修复:

  1. Sampler limit check 之前测错了指标(max_samplers_per_shader_stagemax_binding_array_sampler_elements_per_shader_stage
  2. 跳过材质不用的资源类型,避免超出 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 8Same−88 MB VRAM
Intel i360P+14%Same
Intel Iris XESameSame
^[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)、浮点精度。

详见 diagnostic-overlay

18. Contiguous Query Access (SIMD)

Query::contiguous_iter() / contiguous_iter_mut() 直接返回 table slice,让 LLVM 自动向量化或显式 SIMD。

benchmark(10,000 实体 position += velocity):

方法时间AVX2
普通迭代5.58 µs5.51 µs
Contiguous 迭代4.88 µs1.87 µs
Contiguous + bypass change detection4.40 µs1.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 实现。

两步流程:

  1. 构建 SavedAsset(简单资产用 SavedAsset::from_asset,含子资产用 SavedAssetBuilder
  2. 调用 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:

  1. GeneratedEnvironmentMapLight 在某些表面朝向下出现接缝
  2. 部分金属材质吸收能量,显得过暗

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 languageWGSL 扩展,计划将内部着色器移植到 WESL
更完整的 Bevy Book在 0.20 周期发布大幅扩充的文档

相关页面