feat(engine): reactive render — animations drive RequestRedraw, focused_mode reactive on Android
All per-frame animation tick systems now write MessageWriter<RequestRedraw> each frame they have active work, allowing WinitSettings focused_mode to switch from Continuous to reactive_low_power(100 ms) on Android. Systems updated: - advance_card_animations (CardAnimationPlugin) - advance_card_anims (AnimationPlugin — deal/win cascade) - tick_shake_anim, tick_settle_anim, tick_foundation_flourish (FeedbackAnimPlugin) - drive_toast_display (AnimationPlugin — toast countdown) - drive_auto_complete (AutoCompletePlugin — step interval keepalive) The 100 ms low-power ceiling means the game timer still ticks ~10×/s with no input; animations self-sustain via the redraw chain at full frame rate while active; and the GPU is completely idle between frames when the board is static. Each plugin registers add_message::<RequestRedraw>() so the message type is available under MinimalPlugins in unit tests. Closes #78, #79 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -172,13 +172,16 @@ fn build_app_with_settings(
|
||||
// a 1-second ceiling when the app is backgrounded cuts wake-up frequency
|
||||
// from ~60 Hz to ≤1 Hz, dramatically reducing background battery drain.
|
||||
//
|
||||
// The focused mode stays Continuous so that card-slide animations remain
|
||||
// smooth. PresentMode::AutoVsync (set above) keeps the GPU capped at the
|
||||
// display refresh rate (~60 Hz) when foregrounded, which already prevents
|
||||
// the GPU from spinning at 200+ fps between vsync intervals.
|
||||
// focused_mode uses reactive_low_power(100 ms) so the CPU only wakes when
|
||||
// an event arrives (touch, resize, etc.) or an animation system writes
|
||||
// RequestRedraw. The 100 ms ceiling is a fallback that ensures the game
|
||||
// timer ticks at least 10×/s even with no input, while keeping the GPU
|
||||
// completely idle between frames when the board is static.
|
||||
// PresentMode::AutoVsync (set above) still caps the GPU at the display
|
||||
// refresh rate when frames do render.
|
||||
#[cfg(target_os = "android")]
|
||||
app.insert_resource(WinitSettings {
|
||||
focused_mode: UpdateMode::Continuous,
|
||||
focused_mode: UpdateMode::reactive_low_power(std::time::Duration::from_millis(100)),
|
||||
unfocused_mode: UpdateMode::reactive_low_power(std::time::Duration::from_secs(1)),
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user