Fix dirty tracking to stop using 100% CPU

This commit is contained in:
Patrick Walton 2019-02-08 20:51:34 -08:00
parent 3cc8f7a11f
commit dbce7e3ad1
1 changed files with 48 additions and 28 deletions

View File

@ -89,7 +89,7 @@ struct DemoApp {
events: Vec<Event>, events: Vec<Event>,
exit: bool, exit: bool,
mouselook_enabled: bool, mouselook_enabled: bool,
ui_event_handled_last_frame: bool, dirty: bool,
ui: DemoUI, ui: DemoUI,
scene_thread_proxy: SceneThreadProxy, scene_thread_proxy: SceneThreadProxy,
@ -146,7 +146,7 @@ impl DemoApp {
events: vec![], events: vec![],
exit: false, exit: false,
mouselook_enabled: false, mouselook_enabled: false,
ui_event_handled_last_frame: false, dirty: true,
ui: DemoUI::new(options), ui: DemoUI::new(options),
scene_thread_proxy, scene_thread_proxy,
@ -177,8 +177,12 @@ impl DemoApp {
let rotation = Transform3DF32::from_rotation(-self.camera_yaw, let rotation = Transform3DF32::from_rotation(-self.camera_yaw,
-self.camera_pitch, -self.camera_pitch,
0.0); 0.0);
if !self.camera_velocity.is_zero() {
self.camera_position = self.camera_position + self.camera_position = self.camera_position +
rotation.transform_point(self.camera_velocity); rotation.transform_point(self.camera_velocity);
self.dirty = true;
}
let aspect = drawable_size.width as f32 / drawable_size.height as f32; let aspect = drawable_size.width as f32 / drawable_size.height as f32;
let mut transform = Transform3DF32::from_perspective(FRAC_PI_4, aspect, 0.025, 100.0); let mut transform = Transform3DF32::from_perspective(FRAC_PI_4, aspect, 0.025, 100.0);
@ -210,16 +214,21 @@ impl DemoApp {
}, },
})).unwrap(); })).unwrap();
} }
if count == 2 {
self.dirty = true;
}
} }
fn handle_events(&mut self) -> UIEvent { fn handle_events(&mut self) -> UIEvent {
let mut ui_event = UIEvent::None; let mut ui_event = UIEvent::None;
let wait_for_event = !self.camera_velocity.is_zero() && self.frame_counter >= 2 && if !self.dirty {
!self.ui_event_handled_last_frame;
if wait_for_event {
self.events.push(self.sdl_event_pump.wait_event()); self.events.push(self.sdl_event_pump.wait_event());
} else {
self.dirty = false;
} }
for event in self.sdl_event_pump.poll_iter() { for event in self.sdl_event_pump.poll_iter() {
self.events.push(event); self.events.push(event);
} }
@ -229,6 +238,7 @@ impl DemoApp {
Event::Quit { .. } | Event::Quit { .. } |
Event::KeyDown { keycode: Some(Keycode::Escape), .. } => { Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
self.exit = true; self.exit = true;
self.dirty = true;
} }
Event::Window { win_event: WindowEvent::SizeChanged(..), .. } => { Event::Window { win_event: WindowEvent::SizeChanged(..), .. } => {
let (drawable_width, drawable_height) = self.window.drawable_size(); let (drawable_width, drawable_height) = self.window.drawable_size();
@ -236,6 +246,7 @@ impl DemoApp {
drawable_height as u32); drawable_height as u32);
self.scene_thread_proxy.set_drawable_size(&drawable_size); self.scene_thread_proxy.set_drawable_size(&drawable_size);
self.renderer.set_main_framebuffer_size(&drawable_size); self.renderer.set_main_framebuffer_size(&drawable_size);
self.dirty = true;
} }
Event::MouseButtonDown { x, y, .. } => { Event::MouseButtonDown { x, y, .. } => {
let point = Point2DI32::new(x, y).scale(self.scale_factor as i32); let point = Point2DI32::new(x, y).scale(self.scale_factor as i32);
@ -244,26 +255,33 @@ impl DemoApp {
Event::MouseMotion { xrel, yrel, .. } if self.mouselook_enabled => { Event::MouseMotion { xrel, yrel, .. } if self.mouselook_enabled => {
self.camera_yaw += xrel as f32 * MOUSELOOK_ROTATION_SPEED; self.camera_yaw += xrel as f32 * MOUSELOOK_ROTATION_SPEED;
self.camera_pitch -= yrel as f32 * MOUSELOOK_ROTATION_SPEED; self.camera_pitch -= yrel as f32 * MOUSELOOK_ROTATION_SPEED;
self.dirty = true;
} }
Event::KeyDown { keycode: Some(Keycode::W), .. } => { Event::KeyDown { keycode: Some(Keycode::W), .. } => {
self.camera_velocity.set_z(-CAMERA_VELOCITY) self.camera_velocity.set_z(-CAMERA_VELOCITY);
self.dirty = true;
} }
Event::KeyDown { keycode: Some(Keycode::S), .. } => { Event::KeyDown { keycode: Some(Keycode::S), .. } => {
self.camera_velocity.set_z(CAMERA_VELOCITY) self.camera_velocity.set_z(CAMERA_VELOCITY);
self.dirty = true;
} }
Event::KeyDown { keycode: Some(Keycode::A), .. } => { Event::KeyDown { keycode: Some(Keycode::A), .. } => {
self.camera_velocity.set_x(-CAMERA_VELOCITY) self.camera_velocity.set_x(-CAMERA_VELOCITY);
self.dirty = true;
} }
Event::KeyDown { keycode: Some(Keycode::D), .. } => { Event::KeyDown { keycode: Some(Keycode::D), .. } => {
self.camera_velocity.set_x(CAMERA_VELOCITY) self.camera_velocity.set_x(CAMERA_VELOCITY);
self.dirty = true;
} }
Event::KeyUp { keycode: Some(Keycode::W), .. } | Event::KeyUp { keycode: Some(Keycode::W), .. } |
Event::KeyUp { keycode: Some(Keycode::S), .. } => { Event::KeyUp { keycode: Some(Keycode::S), .. } => {
self.camera_velocity.set_z(0.0); self.camera_velocity.set_z(0.0);
self.dirty = true;
} }
Event::KeyUp { keycode: Some(Keycode::A), .. } | Event::KeyUp { keycode: Some(Keycode::A), .. } |
Event::KeyUp { keycode: Some(Keycode::D), .. } => { Event::KeyUp { keycode: Some(Keycode::D), .. } => {
self.camera_velocity.set_x(0.0); self.camera_velocity.set_x(0.0);
self.dirty = true;
} }
_ => continue, _ => continue,
} }
@ -301,9 +319,11 @@ impl DemoApp {
self.renderer.debug_ui.add_sample(tile_time, rendering_time); self.renderer.debug_ui.add_sample(tile_time, rendering_time);
self.renderer.debug_ui.draw(); self.renderer.debug_ui.draw();
let had_ui_event = ui_event.is_none(); if !ui_event.is_none() {
self.dirty = true;
}
self.ui.update(&mut self.renderer.debug_ui, &mut ui_event); self.ui.update(&mut self.renderer.debug_ui, &mut ui_event);
self.ui_event_handled_last_frame = had_ui_event && ui_event.is_none();
// If nothing handled the mouse-down event, toggle mouselook. // If nothing handled the mouse-down event, toggle mouselook.
if let UIEvent::MouseDown(_) = ui_event { if let UIEvent::MouseDown(_) = ui_event {