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_neqis 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_clipboardcrate 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_transformnow uses an explicitmulti_threadedfeature instead of piggybacking onstd, and remainingCore*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/FocusGainedevents 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::Srgbclear 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_folderplus 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_colornow uses linear color space (#22588), eliminating a long-standing sRGB inconsistency.
ECS and system ordering
- ECS event reflection:
register_event_keyis 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_folderhot-reload deadlock is now fixed (#23980). The previously tracked bug whereAssetServer::load_foldercould 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
FocusGainedevent now carries aFocusCauseenum (#23993) with variantsPressed(primary mouse click) andNavigated(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 onFocusGainedfields.- Module names for text input files were improved for code organization (#23995). Internal restructuring, no API impact.
Web / single-threaded targets
web_asset_cachenow compiles without themulti_threadedfeature (#23994). UsesFileReaderinstead ofasync_fs::Filein 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
NoCpuCullingopt-in for GPU visibility range culling inmesh_preprocess.wgsl. Shadows no longer pop in the normal case, but--no-cpu-cullingmode remains broken. - PCSS light despawning has a pending fix (#23790) that adds shadow maps and extracted lights to
SyncComponent. Theextracted_light_removedobserver 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:
spotlightandrect_lightexamples 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
GhostNodeadd/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.
Related pages
- bevy-ecs-game-type-fit — Bevy ECS genre fit and selection matrix.
- bevy — Bevy engine/entity hub.
- bevy-projects — ZoOL’s Bevy repositories and game prototypes.
- bevy-migration-notes — current migration-sensitive changes to track.
- bevy-game-dev-2026-05 — May 2026 engine changes and tracking.
- bevy-game-dev-2026-06 — June 2026 engine changes and tracking.