Repaint screen less often
This commit is contained in:
+1
-7
@@ -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
@@ -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
@@ -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
@@ -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,
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user