Fix dirty tracking to stop using 100% CPU
This commit is contained in:
parent
3cc8f7a11f
commit
dbce7e3ad1
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue