This Week in Bevy

What happened this week in the Bevy Engine ecosystem

Links

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

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

primitives

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

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

pancam

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 RenderAssets 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.

tilemap

Tilemap design

showcase

A tilemap level using Bevy's brand new 0.17 TilemapChunk rendering

lens distortion

Lens Distortion

showcase

Lens distortion as a fullscreen post-processing node for cameras

bevy_steam_audio footsteps

bevy_steam_audio footsteps

showcase

A demo showing off footsteps playing spatially simulated audio via bevy_steam_audio

runnable programs

In-game Runnable Programs

showcase

Runnable "programs" inside of another game, which is a terminal emulator simulator. The programs are implemented as states.

ringworld

Ring World

showcase

A ring world is being added to this spaceflight game. This week brought the level-of-detail model, with the high-resolution model coming later.

bevy in python

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())
discovering bevy_hanabi

Discovering bevy_hanabi

showcase

This is bevy_hanabi in a bevy_oxr based environment, including some pose detection for the hands.

2d rpg

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

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

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.

directional navigation

Directional Navigation

showcase

A directional navigation example with a twist; all buttons were added to navigation automatically

beat-em-up

Beat-em-up

showcase

After deciding to try out Bevy a month ago, the dungeon traversal for a new beat-em-up style game is working.

foliage

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.

2d visibility mesh prototype

2d Visibility Mesh

showcase

A quick sketch of a visibility mesh implementation, which can be used to power npc/player detection, lighting, and more. This approach takes Mesh2d vertices, runs them through line/segment raycasting, and updates a regular Mesh2d with the positions each frame.

portal fps

Portal/Half-Life inspired puzzle FPS

showcase

A work-in-progress puzzle FPS inspired by Portal and Half-Life. The prototype already includes portal guns, working portals, narrative elements, and more.

exofactory

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.

bevy_point_cloud

bevy_pointcloud progress

showcase

Progress on bevy_pointcloud continue, showing of continuous loading based on the camera frustum, and wasm/webgl support.

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!

crates.io docs.rs

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:

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 and JointForces 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

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

No devlogs this week

Educational

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

ktx

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.

observer filters

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"

Pull Requests Merged This Week
Contributing

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.

How do I contribute?

Pull Requests Opened this week

Issues Opened this week