From 25bdfbcd26901f0857c23af647f5063d6759fdcd Mon Sep 17 00:00:00 2001 From: Tengu712 Date: Sat, 26 Sep 2026 14:48:31 +0900 Subject: clear screen --- src/main.rs | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index 6303919..3c7f20d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,14 +12,14 @@ use winit::{ window::{Window, WindowId}, }; +mod graphics; + +use graphics::{RenderResult, Renderer}; + +#[derive(Default)] struct App { window: Option>, -} - -impl App { - fn new() -> Self { - Self { window: None } - } + renderer: Option, } impl ApplicationHandler for App { @@ -29,6 +29,7 @@ impl ApplicationHandler for App { event_loop.set_control_flow(ControlFlow::Poll); let attributes = Window::default_attributes() + .with_title("君は呪われている!") .with_inner_size(LogicalSize::new(1280, 720)) .with_fullscreen(None); @@ -37,7 +38,17 @@ impl ApplicationHandler for App { Err(e) => panic!("error: {e}"), }; + let renderer = pollster::block_on(Renderer::new( + Box::new(event_loop.owned_display_handle()), + window.clone(), + )); + let renderer = match renderer { + Ok(v) => v, + Err(e) => panic!("error: {e}"), + }; + self.window = Some(window); + self.renderer = Some(renderer); } fn window_event(&mut self, event_loop: &ActiveEventLoop, _id: WindowId, event: WindowEvent) { @@ -73,14 +84,29 @@ impl ApplicationHandler for App { fn about_to_wait(&mut self, event_loop: &ActiveEventLoop) { let start = Instant::now(); - let Some(_) = &self.window else { + let (Some(window), Some(renderer)) = (&self.window, &self.renderer) else { // NOTE: `window`が`Some`になる`resumed`メソッドで`ControlFlow::Poll`を指定しているため、 // ここで`ControlFlow::WaitUntil`を指定しても問題ない。 event_loop.set_control_flow(ControlFlow::WaitUntil(start + Duration::from_millis(16))); return; }; - sync_60fps(start); + // NOTE: Presentation modeがFIFOの場合はここでスレッドが停止する。 + let current_texture = match renderer.get_current_texture(window) { + RenderResult::Ok(v) => v, + RenderResult::ShouldSkip => { + event_loop + .set_control_flow(ControlFlow::WaitUntil(start + Duration::from_millis(16))); + return; + } + RenderResult::Lost => panic!("fatal: device or surface lost."), + }; + + renderer.render(window, current_texture); + + if !renderer.is_presentation_mode_fifo() { + sync_60fps(start); + } } } @@ -114,7 +140,7 @@ fn main() { Err(e) => panic!("error: {e}"), }; - match event_loop.run_app(&mut App::new()) { + match event_loop.run_app(&mut App::default()) { Ok(()) => {} Err(e) => panic!("error: {e}"), } -- cgit v1.3.1