Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JSConf US Last Call 2015 - Multiplayer WebVR

Avatar for Martin Splitt Martin Splitt
December 05, 2015
26

JSConf US Last Call 2015 - Multiplayer WebVR

Avatar for Martin Splitt

Martin Splitt

December 05, 2015

Transcript

  1. Who am I? I’m Martin from Zurich, Switzerland I work

    at Archilogic & the web @g33konaut
  2. Ingredients 1. interactive 3D content in the browser: WebGL 2.

    VR rendering & controls in the browser: WebVR 3. High speed networking in the browser: WebRTC
  3. Three.js as an abstraction on top var scene = new

    THREE.Scene(), camera = new THREE.PerspectiveCamera(...), renderer = new THREE.WebGLRenderer() var box = new THREE.Mesh(...) scene.add(box) renderer.render(scene, camera) // rinse, repeat
  4. WebVR with Three.js var vrEffect = new THREE.VREffect(renderer), vrControls =

    new THREE.VRControls() … vrControls.update() vrEffect.render(scene, camera)
  5. Cool stuff • Cardboard & Oculus - same WebVR APIs

    • Firefox Nightly (!) & experimental Chromium build • Chrome Android (Canary) has Cardboard tracking support
  6. Meh

  7. Ok, let’s talk numbers Per player: x, y, z +

    pitch, roll, yaw example: 150.384, 10.2, -95.8, 1.53873, 2.63980, 1.87532 Hey, that’s in fact 6 Float32 values. 6 * 32 bit = 192 bit * 60 fps = 11,5 kbps
  8. Ingredients, revisited 1. interactive 3D content in the browser: WebGL

    2. VR rendering & controls in the browser: WebVR 3. High speed networking in the browser: Websockets
  9. Our server 1. manages a list of players & their

    state 2. broadcasts player’s messages Needs these message types: Type (binary) 00 01 10 11 Meaning Player moving Unused Player connect Player disconnect Payload Position / Rotation Unused Position / Rotation -
  10. The protocol • should be binary • as small as

    possible Header Uint8 2 bit type 6 bit Player ID Position Float32[3] X,Y,Z Rotation Float32[3] X,Y,Z
  11. The overhead ws-frame = frame-fin ; 1 bit in length

    frame-rsv1 ; 1 bit in length frame-rsv2 ; 1 bit in length frame-rsv3 ; 1 bit in length frame-opcode ; 4 bits in length frame-masked ; 1 bit in length frame-payload-length ; either 7, 7+16 or 7+64 bits in length frame-payload-data ; n*8 bits in length, where n >= 0 Our packet = 216 bit (27 byte) in total
  12. The client... 1. sets up the game world & game

    state 2. runs the 3D rendering 3. receives messages from the server about other players 4. sends messages to the server about player movement