Repaint screen less often

This commit is contained in:
2026-11-01 21:17:37 -05:00
parent 6e08830b43
commit 833214b759
5 changed files with 26 additions and 14 deletions
+1 -7
View File
@@ -394,12 +394,6 @@ impl ApplicationHandler<UserEvent> for Application {
} }
} }
fn about_to_wait(&mut self, _event_loop: &ActiveEventLoop) {
if let Some(viewport) = self.viewports.get(&ViewportId::ROOT) {
viewport.window.request_redraw();
}
}
fn window_event( fn window_event(
&mut self, &mut self,
event_loop: &ActiveEventLoop, event_loop: &ActiveEventLoop,
@@ -418,7 +412,7 @@ impl ApplicationHandler<UserEvent> for Application {
if close_requested && viewport_id == ViewportId::ROOT { if close_requested && viewport_id == ViewportId::ROOT {
event_loop.exit(); event_loop.exit();
} }
if response.repaint { if response.repaint && !matches!(event, WindowEvent::RedrawRequested) {
viewport.window.request_redraw(); viewport.window.request_redraw();
} }
if !response.consumed { if !response.consumed {
+16 -1
View File
@@ -5,14 +5,19 @@ use std::{
mpsc, mpsc,
}, },
thread, thread,
time::Instant,
}; };
use anyhow::{Result, bail}; use anyhow::{Result, bail};
use egui::ViewportId;
use itertools::Itertools as _; use itertools::Itertools as _;
use wgpu::{ use wgpu::{
Device, Extent3d, Origin3d, Queue, TexelCopyBufferLayout, TexelCopyTextureInfo, Texture, Device, Extent3d, Origin3d, Queue, TexelCopyBufferLayout, TexelCopyTextureInfo, Texture,
TextureDescriptor, TextureFormat, TextureUsages, TextureView, TextureViewDescriptor, TextureDescriptor, TextureFormat, TextureUsages, TextureView, TextureViewDescriptor,
}; };
use winit::event_loop::EventLoopProxy;
use crate::app::UserEvent;
#[derive(Debug)] #[derive(Debug)]
pub struct TextureSink { pub struct TextureSink {
@@ -21,7 +26,11 @@ pub struct TextureSink {
} }
impl TextureSink { impl TextureSink {
pub fn new(device: &Device, queue: Queue) -> (Self, TextureView) { pub fn new(
device: &Device,
queue: Queue,
proxy: EventLoopProxy<UserEvent>,
) -> (Self, TextureView) {
let texture = Self::create_texture(device); let texture = Self::create_texture(device);
let view = texture.create_view(&TextureViewDescriptor::default()); let view = texture.create_view(&TextureViewDescriptor::default());
let buffers = Arc::new(BufferPool::new()); let buffers = Arc::new(BufferPool::new());
@@ -37,6 +46,12 @@ impl TextureSink {
local_buf.copy_from_slice(bytes.as_slice()); local_buf.copy_from_slice(bytes.as_slice());
} }
Self::write_texture(&queue, &texture, local_buf.as_slice()); Self::write_texture(&queue, &texture, local_buf.as_slice());
if proxy
.send_event(UserEvent::RequestRedraw(ViewportId::ROOT, Instant::now()))
.is_err()
{
break;
}
} }
}); });
let sink = Self { buffers, sink }; let sink = Self { buffers, sink };
+1 -1
View File
@@ -134,7 +134,7 @@ fn main() -> Result<()> {
})?; })?;
let event_loop = EventLoop::with_user_event().build().unwrap(); let event_loop = EventLoop::with_user_event().build().unwrap();
event_loop.set_control_flow(ControlFlow::Poll); event_loop.set_control_flow(ControlFlow::Wait);
let proxy = event_loop.create_proxy(); let proxy = event_loop.create_proxy();
let handle = event_loop.owned_display_handle(); let handle = event_loop.owned_display_handle();
event_loop.run_app(&mut Application::new( event_loop.run_app(&mut Application::new(
+1 -2
View File
@@ -803,12 +803,11 @@ impl AppWindow for GameWindow {
true true
}); });
self.child_states.save(ui); self.child_states.save(ui);
ui.request_repaint_after(Duration::from_millis(10));
} }
fn on_init(&mut self, args: InitArgs) { fn on_init(&mut self, args: InitArgs) {
if self.screen.is_none() { if self.screen.is_none() {
let (screen, sink) = GameScreen::init(args.render_state); let (screen, sink) = GameScreen::init(args.render_state, self.proxy.clone());
self.client.send_command(EmulatorCommand::ConnectToSim( self.client.send_command(EmulatorCommand::ConnectToSim(
self.sim_id, self.sim_id,
sink, sink,
+7 -3
View File
@@ -3,8 +3,9 @@ use std::{collections::HashMap, sync::Arc};
use egui::{Color32, Rgba, Vec2, Widget}; use egui::{Color32, Rgba, Vec2, Widget};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use wgpu::{BindGroup, BindGroupLayout, Buffer, RenderPipeline, util::DeviceExt as _}; use wgpu::{BindGroup, BindGroupLayout, Buffer, RenderPipeline, util::DeviceExt as _};
use winit::event_loop::EventLoopProxy;
use crate::graphics::TextureSink; use crate::{app::UserEvent, graphics::TextureSink};
pub struct GameScreen { pub struct GameScreen {
bind_group: Arc<BindGroup>, bind_group: Arc<BindGroup>,
@@ -116,11 +117,14 @@ impl GameScreen {
}); });
} }
pub fn init(render_state: &egui_wgpu::RenderState) -> (Self, TextureSink) { pub fn init(
render_state: &egui_wgpu::RenderState,
proxy: EventLoopProxy<UserEvent>,
) -> (Self, TextureSink) {
let device = &render_state.device; let device = &render_state.device;
let queue = &render_state.queue; let queue = &render_state.queue;
let (sink, texture_view) = TextureSink::new(device, queue.clone()); let (sink, texture_view) = TextureSink::new(device, queue.clone(), proxy);
let sampler = device.create_sampler(&wgpu::SamplerDescriptor::default()); let sampler = device.create_sampler(&wgpu::SamplerDescriptor::default());
let colors = Colors::new( let colors = Colors::new(
Color32::from_rgb(0xff, 0x00, 0x00), Color32::from_rgb(0xff, 0x00, 0x00),