diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 43 |
1 files changed, 39 insertions, 4 deletions
@@ -1,4 +1,4 @@ -use std::rc::Rc; +use std::{cell::RefCell, rc::Rc}; use std::sync::Mutex; use log::{Level, debug, info}; @@ -26,17 +26,27 @@ fn document() -> web_sys::Document { fn canvas() -> JSResult<web_sys::HtmlCanvasElement> { let x = document().query_selector("section.watch canvas")?.ok_or("no canvas")?; - Ok(x.dyn_into::<web_sys::HtmlCanvasElement>()?) + Ok(x.dyn_into()?) } fn fps() -> JSResult<web_sys::HtmlElement> { let x = document().query_selector("section.watch .fps")?.ok_or("no fps counter")?; - Ok(x.dyn_into::<web_sys::HtmlElement>()?) + Ok(x.dyn_into()?) } fn go() -> JSResult<web_sys::HtmlElement> { let x = document().query_selector("section.watch button")?.ok_or("no go button")?; - Ok(x.dyn_into::<web_sys::HtmlElement>()?) + Ok(x.dyn_into()?) +} + +fn iters() -> JSResult<web_sys::HtmlInputElement> { + let x = document().query_selector("section.bench input")?.ok_or("no go button")?; + Ok(x.dyn_into()?) +} + +fn bench() -> JSResult<web_sys::HtmlElement> { + let x = document().query_selector("section.bench button")?.ok_or("no go button")?; + Ok(x.dyn_into()?) } #[wasm_bindgen(start)] @@ -51,7 +61,11 @@ pub fn init() -> JSResult<()> { let mut s = State::new(canvas()?, fps()?)?; s.render_frame(0.0)?; + let shared_s = Rc::new(RefCell::new(s)); + let s1 = shared_s.clone(); + let render_loop = RenderLoop::new(move |t| { + let mut s = shared_s.borrow_mut(); s.update()?; s.render_frame(t)?; Ok(!*paused.lock().unwrap()) @@ -75,5 +89,26 @@ pub fn init() -> JSResult<()> { // handler. go_handler.forget(); + let bench_handler: HandlerClosure = Closure::new(move |e| { + debug!("bench clicked {:?}", e); + let iters = iters()?.value().parse::<u32>().map_err(|_| "iters isn't int")?; + + let mut s = s1.borrow_mut(); + let perf = window().performance().unwrap(); + let start = perf.now(); + for _ in 0..iters { + s.update()?; + } + let end = perf.now(); + let delta = end - start; + let iters_per_ms = Into::<f64>::into(iters) / delta; + + info!("bench done. {iters} iters in {delta} ms ({iters_per_ms} iters per ms)"); + Ok(()) + }); + bench()?.set_onclick(Some(bench_handler.as_ref().unchecked_ref())); + // ibid. + bench_handler.forget(); + Ok(()) } |
