aboutsummaryrefslogtreecommitdiff
path: root/crates/render-demo/src/main.rs
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-02-19 13:27:10 +0300
committerValentin Popov <valentin@popov.link>2026-02-19 13:27:10 +0300
commitcb0ca2f2f0775e62365e873a2dcce5b93082ac9a (patch)
tree1f6b601ec7b21f7243bbdab342d3bdaa5d25d472 /crates/render-demo/src/main.rs
parent7346e695c46bea705d7f9487fc6602b57866048a (diff)
downloadfparkan-cb0ca2f2f0775e62365e873a2dcce5b93082ac9a.tar.xz
fparkan-cb0ca2f2f0775e62365e873a2dcce5b93082ac9a.zip
feat(render-demo): добавить отображение FPS в заголовок окна и stdout в интерактивном режиме
Diffstat (limited to 'crates/render-demo/src/main.rs')
-rw-r--r--crates/render-demo/src/main.rs32
1 files changed, 28 insertions, 4 deletions
diff --git a/crates/render-demo/src/main.rs b/crates/render-demo/src/main.rs
index f76e52c..61f6bfa 100644
--- a/crates/render-demo/src/main.rs
+++ b/crates/render-demo/src/main.rs
@@ -1,8 +1,9 @@
use glow::HasContext as _;
use render_core::{build_render_mesh, compute_bounds_for_mesh};
use render_demo::{load_model_with_name_from_archive, resolve_texture_for_model, LoadedTexture};
+use std::io::Write as _;
use std::path::{Path, PathBuf};
-use std::time::Instant;
+use std::time::{Duration, Instant};
struct Args {
archive: PathBuf,
@@ -271,7 +272,7 @@ fn run(args: Args) -> Result<(), String> {
.video()
.map_err(|err| format!("failed to init SDL2 video: {err}"))?;
- let (window, _gl_ctx, gl_backend) = create_window_and_context(&video, &args)?;
+ let (mut window, _gl_ctx, gl_backend) = create_window_and_context(&video, &args)?;
let _ = if args.capture.is_some() {
video.gl_set_swap_interval(0)
} else {
@@ -342,7 +343,7 @@ fn run(args: Args) -> Result<(), String> {
} else {
run_interactive(
&sdl,
- &window,
+ &mut window,
&gl,
program,
u_mvp.as_ref(),
@@ -587,7 +588,7 @@ fn run_capture(
#[allow(clippy::too_many_arguments)]
fn run_interactive(
sdl: &sdl2::Sdl,
- window: &sdl2::video::Window,
+ window: &mut sdl2::video::Window,
gl: &glow::Context,
program: glow::NativeProgram,
u_mvp: Option<&glow::NativeUniformLocation>,
@@ -608,6 +609,10 @@ fn run_interactive(
.event_pump()
.map_err(|err| format!("failed to get SDL event pump: {err}"))?;
let start = Instant::now();
+ let mut fps_window_start = Instant::now();
+ let mut fps_frames: u32 = 0;
+ let mut fps_printed = false;
+ let base_title = "Parkan Render Demo (SDL2 + OpenGL)";
'main_loop: loop {
for event in events.poll_iter() {
@@ -647,6 +652,25 @@ fn run_interactive(
);
}
window.gl_swap_window();
+
+ fps_frames = fps_frames.saturating_add(1);
+ let elapsed = fps_window_start.elapsed();
+ if elapsed >= Duration::from_millis(500) {
+ let fps = fps_frames as f32 / elapsed.as_secs_f32().max(0.000_1);
+ let frame_time_ms = 1000.0 / fps.max(0.000_1);
+ let _ = window.set_title(&format!(
+ "{base_title} | FPS: {fps:.1} ({frame_time_ms:.2} ms)"
+ ));
+ print!("\rFPS: {fps:.1} ({frame_time_ms:.2} ms)");
+ let _ = std::io::stdout().flush();
+ fps_printed = true;
+ fps_frames = 0;
+ fps_window_start = Instant::now();
+ }
+ }
+
+ if fps_printed {
+ println!();
}
Ok(())