
Avian 0.4, Easier Profiling, and Logging improvements
2025-10-20
This week in Bevy we see a number of tests have been added to the asset processing system to detail the current behavior of actions like loading sub-assets in edge cases. While working groups like Async and Better Audio are making progress as usual.
While in the ecosystem, Avian has moved to a GitHub organization AvianPhysics/avian and moved to take on workflows that are similar to Bevy's when it comes to triage and migration notes.
This is particularly interesting because Avian, which sees 0.4's release this week, has some of the most comprehensive release notes of any ecosystem crate, making them comparable to Bevy's own release notes.
Fix Intel iGPU Rendering
#21475 fixes a bug in Intel iGPU rendering, but what's really interesting about this PR is the documented debugging process to go from a rendered 3d scene, through the GPU setup, into decompiled SPIR-V. If you're at all interested in deep rendering bug debugging, this is a great PR to check out.
Solari indirect specular
#21355 adds initial support for indirect specular lighting (reflections) to Solari's realtime renderer.
Pretty Component Logging
#21587 improved the output of commands(entity).log_components()
to better take advantage of tracing's structured logging when it's available.
When combined with configuring the tracing subscriber (as shown in the app/log_layers.rs
example), this can enable pretty-printed output for debug formatted values.
The debug sigil can be used to log structured data as such:
let secret_message = "Bevy";
info!(?secret_message, "Here's a log that uses the debug sigil");
Primitive Demos
Bevy gains new primitives fairly regularly, and #21563 adds a set of these primitives to the math/render_primitives
example.
The new primitives include:
ConvexPolygon
Segment2d
Polyline2d
CircularSector
CircularSegment
Segment3d
Polyline3d
Cone
ConicalFrustum
Tracy
Profiling Bevy applications can be done in a few ways, including using Tracy.
#21565 updates the Tracy docs, but more importantly, the author behind the PR has put together a GitHub organization and repo to provide builds of the Tracy application. This means that users who previously had to rely on outdated sources (homebrew) or building from source now have accessible pre-built downloads, making Tracy usage much easier.
pan-cam
A second camera was added to the new bevy_camera_controller
crate.
#21520 adds a 2d pan-cam with settings for panning, zooming, and rotation via keyboard input.
cargo run --example pan_cam_controller --features="pan_cam"
Render Assets Diagnostics
#19311 introduces new diagnostics that collect measurements of allocations from MeshAllocator
and MaterialBindGroupAllocator
, and number of RenderAsset
s present.
Alice's Merge Train is a maintainer-level view into active PRs and how the Bevy sausage is made.

Showcase
Bevy work from the #showcase channel in Discord and around the internet. Use hashtag #bevyengine.

bevy_steam_audio footsteps
showcase
A demo showing off footsteps playing spatially simulated audio via bevy_steam_audio

Bevy in Python
showcase
Bevy in Python with hot-reloading! The demo uses pyo3 for bindings and hand-crafted .pyi typings.
# Note the Query1, which returns a type, not a tuple
def rotate(query: Query1[Transform, With[Rotate]], time: Time) -> None:
# With Query instead of Query1 this would look as "for (transform,) in query:"
for transform in query:
transform.rotation *= Quat.from_rotation_y(pi * time.delta_secs())

Eternal
showcase
Eternal is a work-in-progress open-source 2D RPG. This week saw the addition of basic player movement, collisions, walls destruction, some effects and a pixel perfect collision system.

bevy_experimental_editor
showcase
bevy_experimental_editor is an experimental scene editor for Bevy games. It works with Bevy 0.16 and is using egui (which is a pretty popular choice for these kinds of experiments).

bevy_steam_audio sneak peek
showcase
A bevy_steam_audio sneak peek. Steam Audio is Valve's spatial sound simulation library which can be embedded with your game (and doesn't require releasing on Steam). The walls in this level have had different acoustic properties applied to them.

Lost in the Woods
showcase
Foliage rendering, lighting, trees, and terrain combine with a fully custom render pipeline for grass, and fog volume with a custom texture.
The landscape was designed in Blender with A.N.T. Landscape.

Exofactory Demo
showcase
Exofactory released its demo as part of Steam Next Fest. Exofactory is a narrative driven factory builder where your narrative decisions unlock story progression.
MMORPG server emulator
showcase
An experimental MMO server emulator written in Rust with Bevy, targeting Lineage2.

Crates
New releases to crates.io and substantial updates to existing projects
bevy_rand v0.12.1
crate_release
With the release of getrandom
v0.3.4, which fixes Web WASM builds to no longer need --cfg getrandom_backend
, a patch fix to bevy_rand
was released to pin getrandom
to that version upwards, so building Bevy + bevy_rand
for Web will be much easier now. As it is a patch update, just run cargo update
and you are gucci!
meta_merge
crate_release
meta_merge is intended to create sets of macro attributes you can use as a "template" and apply them across many items.
use meta_merge::*;
use bevy::prelude::*;
use serde::{Deserialize, Serialize};
use serde_json::json;
#[export(merge)]
#[derive(Component, Reflect)]
#[reflect(Component)]
struct DefaultComponent;
#[export(merge)]
#[derive(Debug, Serialize, Deserialize)]
struct DefaultSerializable;
#[apply(MergeDefaultSerializable!)]
#[apply(MergeDefaultComponent!)]
#[derive(PartialEq)]
struct FooComponent {
a: u32,
b: String,
c: bool,
}
#[test]
fn foo_component_should_deserialize() {
assert_eq!(
serde_json::from_value(json!({
"a": 1,
"b": "foo",
"c": true,
}))
.map_err(|e| e.to_string()),
Ok(FooComponent {
a: 1,
b: "foo".to_string(),
c: true,
}),
);
}
Lightyear 0.25
crate_release
Lightyear is a full-featured networking library for bevy
v0.25 is a big release with a few sizeable breaking changes
-
Predicted/Interpolated/Confirmed have been merged: the replication updates are now received directly on the Predicted or Interpolated entity.
-
PreSpawned can be used outside of Prediction
-
Improve BevyEnhancedInput handling: input rebroadcasting now works properly with BEI, and BEI inputs consume a LOT less bandwidth
-
Projectile replication example: a new example showcasing various ways of doing projectile replication for FPS games
For more information, you should check out:
- the release notes
- the examples
- the tutorial
Avian Physics 0.4
crate_release
Avian is an ECS-driven physics engine for Bevy.
v0.4 is the biggest release yet, with several new features, quality-of-life improvements, and bug fixes. Highlights include:
- Massive performance improvements: Avian is 3x as fast as before, with much better scaling for multi-core hardware.
- Solver bodies: The solver stores bodies in a much more efficient format optimized for cache locality and future wide SIMD support.
- Graph coloring: The constraint solver is now multi-threaded with graph coloring.
- Simulation islands: Islands are used for a much improved sleeping and waking system, reducing overhead for large game worlds with many resting bodies.
- Force overhaul: The force and impulse APIs have been redesigned from the ground up, providing a much more capable and intuitive interface.
- Joint improvements: Joints now support full reference frames (anchor + basis), and have new
JointDamping
andJointForces
components. - Voxel colliders: Avian now supports voxel colliders for efficient representation of Minecraft-like worlds and other volumetric data.
- Bevy 0.17 support: Avian has been updated to the latest version of Bevy, and has changed its collision event types and system set naming to match.
- Contact API improvements: Contact data now provides access to world-space points, normal speeds, and more accurate contact impulses.
- Benchmarking CLI: Avian has a new CLI tool for benchmarking various scenes and profiling multi-threaded scaling.
Check out the announcement blog post for a more in-depth overview of what has changed and why. A changelog and migration guide can be found on GitHub.
glam_matrix_extras 0.1.0
crate_release
Sometimes, Glam's matrix types are not enough. glam_matrix_extras
aims to address this by implementing various additional matrix types and utilities, such as dedicated symmetric matrices, rectangular matrices, and 2x2 and 3x3 Eigen decompositions. These are already being used in Avian and bevy_heavy, and more will be added as use cases arise (ex: dynamically sized matrices a la Nalgebra for multi-body joints requiring higher degrees of freedom).

bevy_ui_carousel
crate_release
A carousel implementation with picking drag, keyboard, buttons, looping around. This is being used for a mobile game home screen, similar to clash royal

Educational
Tutorials, deep dives, and other information on developing Bevy applications, games, and plugins

Substance Designer and KTX2
educational
A small post aimed at helping people get into using texture compression. Its meant as a very "here's a recommendation" style rather than being a complete treatment of all the different tools and approaches. There's some quick recommendation and set of commands to run at the end.

Bevy Observer Filters
educational
A post that dives into making observer filters work the way people kind of inuit them to work. The tldr; is "only fire the EntityComponentsTrigger
for components that are actually on the entity"
Switch to try_insert in UICameraPropagate authored by cBournhonesque
Stop using `AssetId` in the `AssetServer` and use `AssetIndex` instead. authored by andriyDev
Fix gizmo clipping again authored by atlv24
Create tests to show that dropping handles can cancel loads. authored by andriyDev
Fix Intel iGPU Rendering authored by tychedelia
Rename clear_child* to detach_child* authored by johannesvollmer
Make Radio Button behaviour modular and consistent with other widgets authored by PPakalns
Add tests for asset processing to show the problem with #21269. authored by andriyDev
Fix a crash that occurs when an off-screen entity's material type changes and the material then becomes visible. authored by pcwalton
Solari indirect specular support authored by JMS55
Remove chatty logs from default filter authored by janhohenheim
Fix a few "repeated word" typos authored by rparrett
Fix typo in features.md.tpl authored by cart
bevy_gizmos_render authored by atlv24
Do not attempt to grab pointer on web if unsupported. authored by rectalogic
lift limits up a bit for bevy_material authored by atlv24
Render assets diagnostics authored by hukasu
Add dependencies on morph feature for bevy_pbr, fixes #21528 authored by TeamDman
Match input common_conditions bounds with ButtonInput authored by akimakinai
Update npm test dependencies authored by mockersf
Rename clear_related methods to detach_related authored by WaterWhisperer
Bevy security policy authored by mockersf
Improve Tracy profiling docs (quickstart, split into sections) authored by laundmo
refactor(free-cam): separate configuration settings and dynamic state for the free camera controller authored by syszery
feat(pan-cam): add scaffolding for 2D pan camera controller authored by syszery
Fix lightmaps freeing the wrong slab on removal. authored by andriyDev
Add a way for the `AssetServer` to report how many asset loads started. authored by andriyDev
Add BindGroupLayout caching via descriptors authored by Zeophlite
Rename PanCam.enable to enabled authored by mgi388
Add tests to document three separate asset issues. authored by andriyDev
Add emitted events to feathers widgets' documentation authored by pine-free
Remove `dummy_white_gpu_image` authored by Zeophlite
Add missing primitives to the render_primitives example authored by martinstarman
Make BindGroupLayout label non-optional authored by atlv24
Implement pretty component logging authored by janhohenheim
Want to contribute to Bevy?
Here you can find two types of potential contribution: Pull Requests that might need review and Issues that might need to be worked on.
Pull Requests Opened this week
Add optional wordvec feature for RelationshipSourceCollection authored by SOF3
Support Ui to perform Transform in the world authored by MushineLament
add note about hdr to custom post process. authored by ChristopherBiscardi
time 2.0: stepable, non monotonic, authored by mockersf
Font reference counting using hooks authored by ickshonpe
Allow DiagnosticsBuffer to be applied even if DiagnosticsStore is missing. authored by andriyDev
taplo sort authored by atlv24
Move `MaterialProperties` from `bevy_pbr` to `bevy_material` authored by Zeophlite
Text underline authored by ickshonpe
Nested Queries authored by chescock
Text strikeout authored by ickshonpe
Move asset processing tests to their own file. authored by andriyDev
Minor refactors in change detection authored by JaySpruce
Feature/glam cross constants authored by pine-free
Updated docs for bevy::render::RenderSystems authored by Saphereye
Support non-archetypal `QueryData` authored by chescock
Rename `bevy_reflect`'s `documentation` feature to `reflect_documentation` authored by WaterWhisperer
docs(camera): clarify ndc_to_world method documentation authored by WaterWhisperer
Remove `#[derive(Resource, Component)]` from tests authored by Trashtalk217
Add `try_get_*` component accessors to filtered entity references and mutators authored by VanjaRo
Rewrite the reason for the `clippy::doc_markdown` expectation in the `bevy` main crate to be more accurate authored by LikeLakers2
Update `PanCam` and `FreeCam` to use full term `Camera` authored by syszery
Rename `AnimationEventTrigger::animation_player` to `target` and fix misleading docs surrounding it authored by janhohenheim
Merge button components authored by agluszak
Split `AmbientLight` into two authored by Trashtalk217
Issues Opened this week
custom_post_processing crashes with bloom added authored by meowette
Loads cannot be cancelled if the asset loader creates a labeled asset. authored by andriyDev
VUID-StandaloneSpirv-MemorySemantics-10871 with the latest vulkan validation layer authored by beicause
feathers: Widgets should document which events they emit authored by torsteingrindvik
example panic on windows due to unimplemented in winit authored by maxiloEmmmm
Memory leak in `EntitySpecializationTicks` and `SpecializedMaterialPipelineCache` when a material uses `NotShadowCaster` authored by EmbersArc
Rename clear_related methods to detach_related authored by alice-i-cecile
Support resolution scaling and configuring main texture size of Camera authored by beicause
`Deferred::apply` runs even if the system never ran. authored by andriyDev
TypePath of types inside functions do not include the function name. authored by andriyDev
Confusing duplicate named `Button` components authored by robojeb
ConvexPolygon depends on vertex order authored by unc0mm0n
`Key` inputs (with modifier keys) continuing if the "key release order" incorrect authored by cppHusky
Built-in 'Contain' or 'Fit' scaling for `ImageNode` to preserve aspect ratio authored by aojiaoxiaolinlin
Multiple meshes with the same backing store but different indices authored by eira-fransham
`DespawnOnEnter`/`DespawnOnExit` no longer working on `Observers` authored by Ceedrich
UI measurement tracking issue authored by ickshonpe
Text Examples authored by ickshonpe
FPS overlay flashing red authored by Aceeri
Consider using the full term `Camera` in `FreeCam`, `PanCam` and friends authored by mgi388
Toggling shadow caster/receiver doesn't work in the example authored by yzsolt
impl Sync for SubApp to package as Components safely authored by GhostMinerPlus
NestedLoader can panic from UnapprovedPathMode authored by MickHarrigan
Strange behaviors with bevy_task and parallel executors authored by chengts95