diff options
author | Joel Martin <github@martintribe.org> | 2018-07-26 16:03:12 +0900 |
---|---|---|
committer | Joel Martin <github@martintribe.org> | 2018-07-26 16:05:55 +0900 |
commit | 5372d169ccf9dc0b4d2311ea4d7a1b8ab7b42af4 (patch) | |
tree | 079b4596a3179f0d538982f2435bf0fa5446f69b | |
parent | af54d4b95e359bc4b1f7831ad328a825fe0383d0 (diff) | |
download | novnc-5372d169ccf9dc0b4d2311ea4d7a1b8ab7b42af4.tar.gz |
wasm: simplify down to just use MODE 3 (draw3).
draw3 was the pretty clear winner performance-wise.
-rw-r--r-- | core/wasm/README.md | 14 | ||||
-rw-r--r-- | core/wasm/index.js | 25 | ||||
-rw-r--r-- | core/wasm/src/lib.rs | 81 |
3 files changed, 8 insertions, 112 deletions
diff --git a/core/wasm/README.md b/core/wasm/README.md index 6cbf3d1..d0c26c1 100644 --- a/core/wasm/README.md +++ b/core/wasm/README.md @@ -30,17 +30,3 @@ npm run serve # then visit localhost:8080 outside the container Note that `run server` will automatically detect modification to `index.js` and reload the page. - -## Preliminary results: - -* 2048x1024, draw1, release: 23 fps -* 2048x1024, draw2, release: 51 fps -* 2048x1024, draw3, release: 60 fps - -* 1024x1024, draw1, release: 36 fps -* 1024x1024, draw2, release: 60 fps -* 1024x1024, draw3, release: 60 fps - -* 1024x1024, draw1, debug: 3 fps -* 1024x1024, draw2, debug: 8 fps -* 1024x1024, draw3, debug: 9 fps diff --git a/core/wasm/index.js b/core/wasm/index.js index b317b76..7570b96 100644 --- a/core/wasm/index.js +++ b/core/wasm/index.js @@ -1,6 +1,5 @@ const WIDTH = 2048 const HEIGHT = 1024 -const MODE = 3 import * as novnc from './novnc' import { memory } from './novnc_bg' @@ -11,32 +10,22 @@ const ctx = canvas.getContext('2d') canvas.width = WIDTH canvas.height = HEIGHT -if (MODE === 2 || MODE === 3) { - let byteSize = WIDTH * HEIGHT * 4 - var pointer = novnc.alloc( byteSize ) +let byteSize = WIDTH * HEIGHT * 4 +let pointer = novnc.alloc( byteSize ) - var u8array = new Uint8ClampedArray(memory.buffer, pointer, byteSize) - var imgData = new ImageData(u8array, WIDTH, HEIGHT) -} +let u8array = new Uint8ClampedArray(memory.buffer, pointer, byteSize) +let imgData = new ImageData(u8array, WIDTH, HEIGHT) let frame = -1 function renderLoop() { - const startMs = (new Date()).getTime() + //const startMs = (new Date()).getTime() fps.render() frame += 1 - if (MODE === 1) { - novnc.draw1(ctx, WIDTH, HEIGHT, frame) - } else { - if (MODE === 2) { - novnc.draw2(pointer, WIDTH, HEIGHT, frame) - } else if (MODE === 3) { - novnc.draw3(pointer, WIDTH, HEIGHT, frame) - } + novnc.draw(pointer, WIDTH, HEIGHT, frame) + ctx.putImageData(imgData, 0, 0) - ctx.putImageData(imgData, 0, 0) - } animationId = requestAnimationFrame(renderLoop) //console.log("elapsed:", (new Date()).getTime() - startMs) } diff --git a/core/wasm/src/lib.rs b/core/wasm/src/lib.rs index fc599b1..1a07b21 100644 --- a/core/wasm/src/lib.rs +++ b/core/wasm/src/lib.rs @@ -7,62 +7,6 @@ use std::slice; use std::os::raw::c_void; use wasm_bindgen::prelude::*; -////////////////////////////////////////////////////////// -/// draw1 - -#[wasm_bindgen] -extern "C" { - pub type ImageData; - - #[wasm_bindgen(constructor)] - pub fn new(arr: &Uint8ClampedArray, width: u32, height: u32) -> ImageData; -} - -#[wasm_bindgen] -extern "C" { - pub type Uint8ClampedArray; - - #[wasm_bindgen(constructor)] - pub fn new(arr: &[u8]) -> Uint8ClampedArray; -} - -#[wasm_bindgen] -extern "C" { - pub type CanvasRenderingContext2D; - - #[wasm_bindgen(method, js_name = putImageData)] - pub fn put_image_data(this: &CanvasRenderingContext2D, image_data: &ImageData, p_1: i32, p_2: i32); -} - -pub fn fill(width: u32, height: u32, frame: u32) -> Vec<u8> { - let mut data: Vec<u8> = vec![]; - - for x in 0..width { - for y in 0..height { - let r = if (x%512) < 256 {x%256} else {255-(x%256)}; - let g = if (y%512) < 256 {y%256} else {255-(y%256)}; - let b = if (frame%512) < 256 {frame%256} else {255-(frame%256)}; - data.push(r as u8); - data.push(g as u8); - data.push(b as u8); - data.push(255); - } - } - - data -} - -#[wasm_bindgen] -pub fn draw1(ctx: &CanvasRenderingContext2D, width: u32, height: u32, frame: u32) { - let data = fill(width, height, frame); - let uint8_array = Uint8ClampedArray::new(&data); - - ctx.put_image_data(&ImageData::new(&uint8_array, width, height), 0, 0); -} - -////////////////////////////////////////////////////////// -/// draw2 - // In order to work with the memory we expose allocation method #[wasm_bindgen] pub fn alloc(size: usize) -> *mut c_void { @@ -73,30 +17,7 @@ pub fn alloc(size: usize) -> *mut c_void { } #[wasm_bindgen] -pub fn draw2(mem: *mut u8, width: usize, height: usize, frame: u32) { - - // pixels are stored in RGBA, so each pixel is 4 bytes - let sl = unsafe { slice::from_raw_parts_mut(mem, width * height * 4) }; - - for y in 0..height { - for x in 0..width { - let r = if (x%512) < 256 {x%256} else {255-(x%256)}; - let g = if (y%512) < 256 {y%256} else {255-(y%256)}; - let b = if (frame%512) < 256 {frame%256} else {255-(frame%256)}; - let xy = x*4 + y*4*width; - sl[xy + 0] = r as u8; - sl[xy + 1] = g as u8; - sl[xy + 2] = b as u8; - sl[xy + 3] = 255; - } - } -} - -////////////////////////////////////////////////////////// -/// draw3 - -#[wasm_bindgen] -pub fn draw3(mem: *mut u32, width: usize, height: usize, frame: u32) { +pub fn draw(mem: *mut u32, width: usize, height: usize, frame: u32) { // pixels are stored in RGBA let sl = unsafe { slice::from_raw_parts_mut(mem, width * height) }; |