aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml4
-rw-r--r--site/index.html2
-rw-r--r--src/lib.rs43
3 files changed, 43 insertions, 6 deletions
diff --git a/Cargo.toml b/Cargo.toml
index bd6395a..c0df418 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -18,5 +18,7 @@ features = ["js"]
version = "2.3"
[dependencies.web-sys]
-features = ["Document", "DocumentTimeline", "Element", "Event", "HtmlElement", "HtmlCanvasElement", "CanvasRenderingContext2d", "Node", "Window"]
+features = ["CanvasRenderingContext2d", "Document", "DocumentTimeline",
+ "Element", "Event", "HtmlCanvasElement", "HtmlElement", "HtmlInputElement",
+ "Node", "Performance", "Window"]
version = "0.3"
diff --git a/site/index.html b/site/index.html
index dd747c1..e978b31 100644
--- a/site/index.html
+++ b/site/index.html
@@ -22,7 +22,7 @@
<section class='bench'>
<h2>bench</h2>
- <input name='iters' value='1000'>
+ <input name='iters' value='100000'>
<button>bench</button>
</section>
diff --git a/src/lib.rs b/src/lib.rs
index 7dd08e9..60fdc0f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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(())
}