bevyengine/bevy · Weekly · Jul 20, 2026 - Jul 26, 2026

bevyengine/bevy Weekly #XX: UI Retained Rendering, Example Migration Wave, and Solari Performance Gains (July 20–26, 2026)

Commits summarized
42
Period
Jul 20 - Jul 26, 2026
Published
Jul 27, 2026

bevyengine/bevy Weekly #XX: UI Retained Rendering, Example Migration Wave, and Solari Performance Gains

Period: July 20 – July 26, 2026 · 42 commits in period

This edition highlights the biggest changes from the past week, drawn from 42 commits. If you work with UI, rendering, or bevy_feathers, there's something here for you.

📌 UI & Widgets

UI Render World Data Retention (01107e7)

Patrick Walton landed a foundational patch that stops re-extracting all UI render world data from scratch every frame. Instead, phase items and render-world entities are retained across frames, with ECS change detection driving re-extraction only for changed UI nodes.

  • Marked improvement on many_buttons: median frame time went from 48.29 ms → 45.16 ms (1.07× speedup), with much larger gains expected once follow-ups land (retaining SortedRenderPhase items, moving work to extraction phase, GPU preprocessing).
  • A side effect: the Changed flag is now set on any visual change, which can trigger unnecessary layout reflows for color-only updates. A follow-up to give layout its own dirty flags is planned.

Scrollbar Autohide & Select Fixes (d30c0cd)

  • Scrollbars now autohide by default when content fits the container.
  • Re-selecting the currently selected item in a Select widget now closes the popup, thanks to a new ReselectListRow event.
  • Added small padding to scrollbar placement inside popups.

AutoFocus Now Distinguishable (6ea281c)

  • New FocusCause::Auto variant emitted by AutoFocus, so automatic focus changes no longer masquerade as keyboard/gamepad navigation.

Keyboard Layout Fixes for EditableText (77b17eb)

  • Ctrl+A/C/X/V shortcuts now work on non-Latin layouts (Cyrillic, Greek, Hebrew, Arabic, etc.) by falling back to physical key_code when logical_key is not ASCII.

Steam OSK Input (a642af4)

  • Editable text inputs now accept produced text from unidentified keys, fixing uppercase and shifted character entry from Steam's on-screen keyboard.

Standalone Build Fix for bevy_ui_widgets (8997cf5)

  • Declared the bevy_input_focus/bevy_picking feature dependency so bevy_ui_widgets compiles standalone again.

🎨 Example Migration: Phase 4–6

The ongoing effort to migrate examples from deprecated Button and raw UI logic to bevy_feathers components (FeathersRadio, FeathersNumberInput, FeathersButton, ui_widgets::Button) continues. Kevin Chen led the charge with contributions from Tyler Earls, thomas, and others.

PR Example Widgets Used
#25071 computed_states ui_widgets::Button, Checkbox
#25064 clustered_decals FeathersRadioButton, FeathersNumberInput
#25073 directional_navigation_overrides ui_widgets::Button, bsn!
#25063 ui_texture_atlas_slice bevy_ui_widgets::Button
#25040 ssr FeathersRadio, FeathersNumberInput
#25086 light_probe_blending FeathersRadio
#25104 mirror FeathersRadio
#25100 color_grading FeathersNumberInput
#25085 light_textures FeathersRadio, FeathersNumberInput
#25080 pccm FeathersRadioButton
#25109 specular_tint FeathersRadio
#25102 dynamic_mip_generation FeathersRadio, FeathersButton
#25112 cooldown ui_widgets::Button, bsn!
#25129 ghost_nodes ui_widgets::Button, bsn!
#25091 occlusion_culling FeathersRadio
#25124 box_shadow FeathersRadio, FeathersNumberInput, FeathersButton, bsn!
#25130 mixed_lighting FeathersRadio

Many of these also convert UI assembly to the bsn! builder macro, reducing boilerplate.

⚡ Rendering & Performance

Solari: Reduced Temporal Shadow Lag (f755ea4)

  • Uses the previous frame's TLAS for visibility testing in MIS when merging the temporal reservoir, reducing directional shadow lag. Slight VRAM cost increase.

Solari: Retained Instance Extraction (17ca59b)

  • Only extracts changed main-world entities, with dedicated systems for new/deleted entities, transform updates (common case), mesh/material updates (rare), and material set updates. Profiles show significant CPU time reduction in extraction.

Remove Expensive Queue Submit from Sparse Buffer Vec (38d9988)

  • Removed a dedicated GPU queue submit that wasn't worth the overhead. The work is now batched into a single compute pass, improving frame times in bevy_city.

dynamic_mip_generation Gains LODs via VisibilityRange (286e81b)

  • Most meshes in bevy_city now have LODs, replacing distant meshes with cubes for significant GPU savings. Stats tracking and tweaked defaults included.

Use ECS for Render World Window Data (71372e9)

  • Render world window data is now stored as ECS components via SyncToRenderWorld, replacing EntityHashMap lookups. No behavioral changes, but simplifies the codebase.

🛠️ ECS & Platform Improvements

AlignedVec for Safer Shader Buffer Access (bd24f53)

  • New AlignedVec type in bevy_platform guarantees runtime-specified alignment, enabling direct bytemuck::cast_slice/cast_slice_mut on shader buffer data without unaligned reads. Used by ShaderBuffer improvements.

ensure! Macro for BevyError (5818e33)

  • New ensure! macro that returns a BevyError when a condition is false, mirroring the pattern of bail!.

Split Ordered and Unordered TypeIdMap (09bef1f)

  • Restored TypeIdMap as a hash-backed map (average O(1) removal), and added TypeIdIndexMap for the few call sites that need insertion order. Replaced expensive shift_remove calls with remove.

Entity::PLACEHOLDEROption<Entity> (6b6f6fd)

  • Straightforward conversions from Entity::PLACEHOLDER to Option<Entity> in UI code, making null handling more idiomatic.

Default for EntityEquivalentIndexSet (ee1f9f6)

  • Removed incorrect Default derive that required a key constraint; added an explicit Default impl that works on any key type.

🔧 Other Fixes & Changes

  • Transform Gizmo viewport fix (20166ec): Overlay camera now mirrors the main camera's viewport, fixing gizmo placement on cameras with custom viewports.
  • many_text --animate switch (0ecdfaa): Text is now static by default; pass --animate to re-enable the previous behavior.
  • compute_mesh type mismatch (e3af87d): Storage buffer type corrected from u32f32 to match the shader.
  • FromTemplate visibility fix (fdc6cf4): Template struct fields now preserve the visibility of the original type.
  • FromTemplate for RenderTarget (daadd06): Manual impl enables RenderTarget use in the bsn! macro.
  • ImagePlugin compressed processor extensions (d81f683): New field default_compressed_image_processor_extensions lets users override which file extensions get auto-compressed.
  • feathers_gallery uses caption() helper (742979e): Consistent use of the caption shortcut throughout the example.
  • fetch_updatetry_update (0028119): Fixes deprecation warning on nightly 1.99+.
  • Dependency bump (c0404fa): dtolnay/rust-toolchain GitHub Action updated.

Highlights from 42 commits between July 20–26, 2026.

Repository updates

Follow future updates

Get generated bevyengine/bevy development summaries by email, or follow the weekly and monthly RSS feeds.

Sign in to subscribe by email. RSS feeds are public.

Sign in to subscribe