Bevy 0.4, a Rust game engine release, ships a WebGL2 rendering backend for the web, a cross-platform #[bevy_main] macro, live shader reloading, and a rewritten ECS with flexible system parameter ordering (25% faster compile times) and simplified query filters separated from components. It introduces a new Schedule V2 with custom stages, run criteria, and fixed timestep support, deprecates for-each systems in favor of query-based iteration, adds app States for lifecycle-based system control, a new bevy_reflect crate replacing bevy_property, GLTF camera import, scene spawning as children, dynamic linking for faster iterative compiles, improved text layout, several rendering optimizations, tracing-based logging/profiling, HIDPI display support, timer API improvements, and Apple Silicon support.

24m read timeFrom bevy.org
Post cover image
Table of contents
WASM + WebGL2 #Cross Platform Main Function #Live Shader Reloading #ECS Improvements #States #GLTF Improvements #Spawn Scenes as Children #Dynamic Linking #Text Layout Improvements #Renderer Optimization #Reflection #3D Texture Assets #Logging and Profiling #HIDPI #Timer Improvements #Task System Improvements #Apple Silicon Support #New Examples #Change Log #Contributors #

Questions this post answers

What changed in Bevy 0.4's ECS system parameter ordering?

Bevy 0.4 removed the requirement that system parameters follow a specific order like Commands, Resources, then Queries. Previously, functions like fn system(query, commands, time) would fail to compile unless parameters were ordered correctly. The engine now uses a SystemParam trait instead of the old IntoSystem macro, which also cut clean compile times by about 25% and let commands be written as commands: &mut Commands instead of mut commands: Commands. Rust game developers tracking Bevy's breaking API changes can follow release details on daily.dev.

Why did Bevy remove for-each systems in version 0.4?

For-each systems were deprecated because they were fundamentally limited compared to query-based systems: they couldn't iterate removed components, filter, control iteration order, or use multiple queries simultaneously. They also caused newcomer confusion around mutable references and criteria-based execution, added roughly 5 seconds to clean compile times, and required a complicated internal macro to maintain. Developers migrating Bevy ECS code can check upgrade notes like these on daily.dev.

How do you separate query filters from components in Bevy 0.4?

In Bevy 0.4, query filters like With, Without, and Changed moved out of the component type parameter into a second, separate type parameter on Query, for example Query<(&Transform, &Velocity), (With<A>, Without<B>, Changed<Velocity>)>. Previously filters were nested inside components, such as Query<With<A, Without<B, (&Transform, Changed<Velocity>)>>>, which made it unclear whether a filter also returned a value. Rust developers adapting queries to a new ECS API can reference specifics like this on daily.dev.

2 Impressions