Bevy Game Development

This page collects reusable Bevy/Rust game-development practices, patterns, and implementation notes.

Scope

Use this page for cross-project Bevy concepts rather than one-off repository details. Project-specific facts should go under bevy-projects or dedicated entity/query pages.

Initial topic map

  • ECS architecture and scheduling
  • bevy-ecs-game-type-fit: choose genres by homogeneous entity density × update frequency
  • Plugin organization
  • Game state management
  • Input, camera, and UI systems
  • Asset pipeline, audio, and save/high-score systems
  • Rendering, visibility, fog-of-war, and visual effects

2026-04-24 engine changes worth tracking

ECS ergonomics

  • EntityCommands::insert_if_neq is a small but practical API improvement for systems that repeatedly write stable component values. It should reduce boilerplate around “only mutate when changed” logic and may help keep change detection cleaner in gameplay/UI code.

Tooling and UI capability

  • The new bevy_clipboard crate materially improves Bevy’s viability for tool-heavy apps, level editors, in-game console/admin surfaces, and text-input-heavy flows. For ZoOL this matters if any local Bevy project grows into an editor or debug-heavy internal tool.
  • Picking now supports attaching custom per-hit metadata, which is useful for editor gizmos, contextual mesh inspection, custom hover semantics, and specialized interaction systems where a bare entity/depth pair is not enough.

Upgrade hygiene

  • Bevy’s maintainers are continuing to pay down confusing surface area before the next release line: bevy_transform now uses an explicit multi_threaded feature instead of piggybacking on std, and remaining Core* UI widget names were renamed with migration-guide coverage.^[raw/articles/bevy-daily-2026-04-24-bevy-transform-feature-flags.md]

2026-04-25 engine changes worth tracking

UI, input, and tools

  • Text input is explicitly described upstream as a headline Bevy 0.19 feature; default colors and example layout were polished, which makes quick prototypes and user-facing examples look less ad hoc.
  • Focus event deduplication means UI systems should be able to rely more directly on focus transitions instead of filtering duplicate FocusLost / FocusGained events after repeated clicks on the same text field.
  • The bevy-remote-protocol screenshot example demonstrates taking screenshots through the Bevy Remote Protocol, useful for automated smoke tests, remote debugging, or editor/dev-tool workflows that need visual capture.

Rendering and web targets

  • CompositingSpace::Srgb clear color conversion was fixed; any project doing color-sensitive 2D rendering or UI compositing should include a visual regression check when moving to a revision with this change.
  • Motion blur now works again in WebGL2 in the merged PR’s testing, but depth-of-field fixes were explicitly not included; browser-targeted effects still need per-feature testing across WebGL2/WebGPU.
  • Solari BRDF now uses a local TBN to avoid mikktspace-produced seams in white-furnace sphere tests; this is a niche but important correctness signal for advanced lighting experiments.

Watch-only bugs

  • load_folder plus the dev file watcher has an open deadlock report when files are added/removed; avoid relying on hot folder reload for critical workflows until resolved or locally tested. Update 2026-04-27: This deadlock has been FIXED in #23980.
  • An open ECS run-condition report says not(resource_added::<T>).and(...) may not suppress the added-frame case as expected; countdown/state-transition logic should get explicit tests if it composes run conditions this way.

2026-04-26 engine changes worth tracking

IME and CJK text input

  • IME (Input Method Editor) support for text input was merged as a headline 0.19 feature (#23841). This enables CJK and other IME-based language input in Bevy text fields. For ZoOL’s projects targeting Chinese users or requiring multi-language text input, this is a major capability unlock.

Editor/tooling widgets

  • A numeric input widget (#23842) was merged, allowing Vec3 editing and other numeric controls. Combined with the clipboard support from 2026-04-24, Bevy’s built-in tooling capability is rapidly approaching viability for editor-like applications.
  • Text input now supports optional select-all-on-focus behavior (#23969), matching standard UX expectations for form-like interactions.

Rendering performance and correctness

  • Shadow map sharing across cameras (#23713): point and spot lights now render shadow maps only once regardless of camera count. This is a significant performance optimization for multi-camera scenes.
  • Camera swap chain and view target rendering fixes (#23959) improve rendering correctness for complex camera setups.
  • EnvironmentMapLight::solid_color now uses linear color space (#22588), eliminating a long-standing sRGB inconsistency.

ECS and system ordering

  • ECS event reflection: register_event_key is now exposed through reflection (#23973), enabling dynamic observer patterns.
  • Ambiguity detection testing is now stricter (#23846), catching more real ordering bugs.

Asset pipeline

  • Empty processed directory cleanup bug fixed (#23984). Previously, asset processing could get permanently stuck on empty directories.

0.19 milestone status

  • 95% complete (330 closed, 15 open). Key remaining open issues: mesh specialization performance regression (#23114), Vulkan Bistro scene flashing (#23183), ECS query performance regression from FilteredAccess changes (#23464), first_person_view_model example broken by text input changes (#23470).

2026-04-27 engine changes worth tracking

Asset pipeline

  • load_folder hot-reload deadlock is now fixed (#23980). The previously tracked bug where AssetServer::load_folder could deadlock during file-watcher add/remove events has been resolved. This is a critical fix for projects that rely on hot folder reload during development.

UI and text input

  • FocusGained event now carries a FocusCause enum (#23993) with variants Pressed (primary mouse click) and Navigated (tab, auto-focus, non-primary mouse). Single-line text inputs select all text on navigation, matching HTML standard behavior. This is a breaking change for code that pattern-matches on FocusGained fields.
  • Module names for text input files were improved for code organization (#23995). Internal restructuring, no API impact.

Web / single-threaded targets

  • web_asset_cache now compiles without the multi_threaded feature (#23994). Uses FileReader instead of async_fs::File in single-threaded mode. Relevant for wasm builds and other constrained targets.

0.19 milestone update

  • Milestone now has ~11 open issues (down from 15 on 2026-04-26). Remaining blockers are mostly platform-specific rendering regressions: Vulkan Bistro flashing (#23183), DX12 black meshes (#23573), WebGL2 scene/deferred rendering (#23627, #23975), Safari WebGPU strobing (#23753), and shadow visibility range (#23991).

2026-04-28 engine changes worth tracking

Rendering fixes in progress

  • Visibility range shadow popping has a pending fix (#23996) that corrects the NoCpuCulling opt-in for GPU visibility range culling in mesh_preprocess.wgsl. Shadows no longer pop in the normal case, but --no-cpu-culling mode remains broken.
  • PCSS light despawning has a pending fix (#23790) that adds shadow maps and extracted lights to SyncComponent. The extracted_light_removed observer was removed in favor of the SyncComponent approach, which also eliminates a one-frame darkness blip when toggling light types.
  • Mesh view bind group layout on demand (#23982) fixes WebGL2 3D scene rendering by creating bind group layouts lazily instead of pre-allocating exponential combinations. Reduces sampled texture count to 17. Includes migration guide.
  • New issue: spotlight and rect_light examples render incorrectly (#23997, filed by mockersf). Affects Linux and macOS.

UI fixes

  • GhostNode updates have a pending fix (#24001). The UI node and Taffy layout trees were not synchronized after GhostNode add/remove/detach operations. The fix collects non-ghost ancestors and updates their children in the Taffy tree. Previously-failing tests now pass.

0.19 milestone status

  • 93% complete (294/315 closed, 21 open issues). The visible milestone view shows 14 items, mostly platform-specific rendering regressions (Vulkan, DX12, WebGL2, Safari WebGPU, Android Pixel 10). No new ECS or gameplay system blockers.