5
I created two HTML clients that communicate through a websocket server. One of the clients draws a 3D model on a canvas using the Three.js library and then sends the Webgl context binary file from the canvas to the other client via websocket. Virtually a canvas stream between multiple clients.
The basis of 3D rendering code
The problem is that the Webgl library is quite inefficient, to the point that the only way I was able to send the binary data was by using the method gl.readPixels() which is VERY slow (about 3 seconds). Being that I need to stay as fluid as possible.
Below is the way I capture the webGL context and send by websocket.
function animate() {
requestAnimationFrame( animate );
render();
var ctx = renderer.getContext();
var byteArray = new Uint8Array(1280 * 720 * 4);
ctx.readPixels(0,0,1280, 720, ctx.RGBA, ctx.UNSIGNED_BYTE, byteArray);
socket.send(byteArray.buffer);
}
You want to send a 1280x720 image by a socket to each animation frame?! Assuming 24 frames per second, you would need a network connection of 88 megabytes per second at least... About
readPixels, in fact it is a relatively slow operation, but 3 seconds is too much! (I hear about 10ms or something) Which browser and operating system are you using? Are you sure the bottleneck is thereadPixels, and not some other operation in your code?– mgibsonbr
You can send instructions using JSON to the other client and rebuild a 3D model to reproduce instructions here.
– Walle Cyril