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 (retainingSortedRenderPhaseitems, moving work to extraction phase, GPU preprocessing). - A side effect: the
Changedflag 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
Selectwidget now closes the popup, thanks to a newReselectListRowevent. - Added small padding to scrollbar placement inside popups.
AutoFocus Now Distinguishable (6ea281c)
- New
FocusCause::Autovariant emitted byAutoFocus, 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_codewhenlogical_keyis 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_pickingfeature dependency sobevy_ui_widgetscompiles 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_citynow 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, replacingEntityHashMaplookups. No behavioral changes, but simplifies the codebase.
🛠️ ECS & Platform Improvements
AlignedVec for Safer Shader Buffer Access (bd24f53)
- New
AlignedVectype inbevy_platformguarantees runtime-specified alignment, enabling directbytemuck::cast_slice/cast_slice_muton shader buffer data without unaligned reads. Used byShaderBufferimprovements.
ensure! Macro for BevyError (5818e33)
- New
ensure!macro that returns aBevyErrorwhen a condition is false, mirroring the pattern ofbail!.
Split Ordered and Unordered TypeIdMap (09bef1f)
- Restored
TypeIdMapas a hash-backed map (average O(1) removal), and addedTypeIdIndexMapfor the few call sites that need insertion order. Replaced expensiveshift_removecalls withremove.
Entity::PLACEHOLDER → Option<Entity> (6b6f6fd)
- Straightforward conversions from
Entity::PLACEHOLDERtoOption<Entity>in UI code, making null handling more idiomatic.
Default for EntityEquivalentIndexSet (ee1f9f6)
- Removed incorrect
Defaultderive that required a key constraint; added an explicitDefaultimpl 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--animateswitch (0ecdfaa): Text is now static by default; pass--animateto re-enable the previous behavior.compute_meshtype mismatch (e3af87d): Storage buffer type corrected fromu32→f32to match the shader.FromTemplatevisibility fix (fdc6cf4): Template struct fields now preserve the visibility of the original type.FromTemplateforRenderTarget(daadd06): Manual impl enablesRenderTargetuse in thebsn!macro.ImagePlugincompressed processor extensions (d81f683): New fielddefault_compressed_image_processor_extensionslets users override which file extensions get auto-compressed.feathers_galleryusescaption()helper (742979e): Consistent use of thecaptionshortcut throughout the example.fetch_update→try_update(0028119): Fixes deprecation warning on nightly 1.99+.- Dependency bump (
c0404fa):dtolnay/rust-toolchainGitHub Action updated.
Highlights from 42 commits between July 20–26, 2026.