building a multithreaded web-based game engine using html5/css3 and javascript to connect native and...

38
Corey Clark PhD Daniel Montgomery

Upload: corey-clark

Post on 08-May-2015

3.049 views

Category:

Technology


0 download

DESCRIPTION

As hardware developer’s push away from creating faster processors in lieu of multicore architectures game developers have to leverage multithreading technologies to capitalize on these new devices. With multicore mobile devices the need for a multithreaded web based game engine is a reality. This talk will discuss design of various multithreaded web engine architectures. Two specific threading implementations will be discussed. First technique shows how to create a static thread that is registered with the engine with the same techniques as other loaded resource. A second technique will focus on using a Thread Controller, which has the ability to create dynamic generic threads that can be passed functions during run time and process them in parallel. This also allows for coupling threaded commands together thereby creating critical sections and other common multithreading techniques utilized in C++ coding. Focus will also be placed on design consideration and operation performance. An example will be show that demonstrates how the proper coding style and data structures can make or break your design. Also timing and performance standards will be given for various browsers so users can understand the overall overhead and operational considerations that need to be considered when using threads in a browser based environment. Technology and capability limitations will also be discussed so developers can understand the differences between multithreading in C++ native applications and JavaScript browser-based application. This will also include some tricks on how to design an architecture that allows for some workarounds. Other JavaScript APIs such as WebGL, and WebSockets will also be discussed and demonstrated to help show the full realization of a web based game engine. Coding samples and architectural layouts will be shown to the audience to help drive home the concepts being discussed during the lecture. A functional HTML5 JavaScript Multithreaded Web Engine will be demonstrated during the lectured to show the overall functionality and performance of the techniques described. A summary write up of a sample engine architecture is attached in the supplemental documents that gives a brief description and architectural figures. These will be integrated into the lecture to help visualize some of the concepts being discussed.

TRANSCRIPT

Page 1: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Corey Clark PhD Daniel Montgomery

Page 2: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Web Dev Platform

Cross Platform

Cross Browser

HTML5

WebGL Web Socket

Web Worker

Hardware Acceleration

Optimized Communication

Channel

Parallel Processing

Page 3: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

JaHOVA OS

Kernel

Internal APIs

Threading

Network

Graphics

Web Workers

Web Sockets

WebGL

Page 4: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Web Workers and Multithreading §  Parallel Execution §  Communicates

through Message §  Executes in

Isolated Thread

● No Access To ●  DOM, Window ●  Document, Parent ●  No Shared Memory

● But You Do Have… ●  XHR / WebSockets ●  Navigator,Location ●  setTimeout/setInterval ●  App Cache, importScript

Page 5: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games
Page 6: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Time to Create First Worker •  Varies depending on Worker Size •  Can take a second to start •  Initialize at beginning with a startup routine

Page 7: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games
Page 8: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games
Page 9: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games
Page 10: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Web Worker Variations ● Inline vs. External

●  BlobBuilder ●  Inline only supported by FF and Chrome ●  No difference in performance

● Dynamic ●  Method determined at run time from JSON

string ●  Altered and changed by user at run time

Page 11: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Nested Shared

Worker

Nested Worker

Main Thread

Nested Worker Nested Worker

Window Window

iframe

Shared Worker

Page 12: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Platform Support ● Chrome/Firefox/Safari

●  Chrome/Safari supports Shared Only ●  Firefox supports Nested Only

● Android – (via Firefox and Opera Browser) ● iOS ● IE 10

Page 13: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Command Module

Internal APIs

Thread

Thread Core

Instruction Module

Thread

Thread / iframe

Thread / iframe

Thread Controller

Thread Thread Pool

Thread Manager

Shared Memory

Page 14: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games
Page 15: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

What is WebGL?

OpengGL ES 2.0

Page 16: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

WebGL The Basics Sample API/Libraries

● JavaScript Wrapper for OpenGL ES 2.0 ● Programmable Graphics Pipeline (GLSL) ● Hardware Acceleration

● SpiderGL ● Copperlicht ● CubicVR ● Gladius

Page 17: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games
Page 18: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

WebGL Hardware Test Verts Polys Draw FPS CPU RAM Video OS

858,750 485,292 654 30 2.2GHz Intel i7 Quad Core

4GB AMD Radeon 6750M 1GB

OSX

634,179 353,386 483 30 2.53GHz Intel Core 2 Duo

4GB NVIDIA 9800+ 1GB

Windows 7

590,898 333,924 450 33.33 2.53GHz Intel Core 2 Duo

8GB NVIDIA GeForce 9600M GT 512MB

OSX

Chrome

Page 19: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Browser vs Browser

Browser Verts Polys Draw Calls Chrome 590,898 333,924 450 Aurora 426,773 241,174 325 WebKit Nightly 393,948 222,624 300 Safari 295,473 166,974 225 Firefox 262,648 148,424 200

Page 20: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

WebGL Tid Bits Tips Up and coming

● DebugContex ● WebGL Inspector ● requestAnimFrame ● BMP Support ● No IE Support with out plugins and Hackery

● WebGL Running in Web Worker ● Swapping Memory Buffer rather than copy

Page 21: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

+ +

Page 22: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Web Sockets ● Full Duplex Communication ● No HTTP overhead ● Has Secure Transport Protocol ● Cross Origin Communication ● Very Simple Client Side API ●  Socket.onmessage = function(){} ●  Socket.onopen = function(){} ●  Socket.open(), Socket.send(), Socket.close()

Page 23: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Nitty Gritty ● 2 Bytes Overhead Per Message

●  XHR ~871 Bytes ● Constant Connection

●  No need to re-establish connection (COMET) ● Connecting to Non Browser Applications (via Proxy/Server)

●  Byte Arrays ●  Bit Shifting

Page 24: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Daniel Montgomery

Page 25: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

WebSocket Server Side

● Standard HTTP Request/Response model performs poorly for high number of users

● Server Needs ●  Thread or Non

Blocking IO Design ●  High concurrency at

Low Performance cost

● Existing Servers ●  Node.js ●  Jetty (Java) ●  Ruby (Event

Machine) ●  Python (Twisted)

Page 26: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

● Google V8 Engine ● JavaScript ● Event Driven

● Event Loop with Callbacks ● Non-Blocking

● Native C++ Bindings ● Fast!!

FEATURES • WebSocket Server

• Socket.IO • Kaazing Gateway

• TCP Server • File Server • MySQL, MongoDB, NoSQL

Modules (NPM)

Page 27: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

• Well Kept After • Documented • Quick Response

• Use existing Git • npm dependencies • Fast!

• (“Hello World!” in 1 minute) Free!!!

FEATURES

Page 28: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Other hosting options…

http://no.de eSession("Omega"["gunner", "pilot"]); http://heroku.com

http://nodejitsu.com

http://cloudno.de

Page 29: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

JaHOVA OS Server Module ●  Connect to Multiple Applications on same server

●  Remote Stream Functions

●  User Creation on the fly ●  Support for Multiple Connection Types

●  TCP ●  WebSockets

●  Socket.IO and Express node.js modules

Page 30: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

JOSSM: Breakdown

●  Multiple Sessions ●  Multiple Session Types

●  Defined in a single line!

●  Streamed Sessions, Modules, and Functions ●  Easily add and connect users to multiple sessions

handler.createSession("Omega", "", ["gunner", "pilot"]);

Page 31: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

JOSSM: Session Breakdown

●  Session Specific Properties ●  On Events

●  Open ●  Close ●  Message ●  Error

●  Multiple Modules

●  Remote Module Requests

Page 32: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Engine Architecture ● Dynamic Nested/Shared Web Worker

●  Thread Controller ●  Shared Memory Pool

● Custom Event Management System ● Available Engines

●  Akihabara (2D) ●  Effect Game (2D) ●  Isogenic Engine ●  Johmoho

Page 33: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

3rd Party Extensions

Application

JaHOVA OS

Kernel Internal APIs

Resource and Schedule Manager

Module

Instruction Module

Command Module

Threading

Network

DOM

Graphics

Page 34: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Resource and Schedule Manager Module Event Manager

Event Manager Interface

Event Object Event

Event …

Event Object Event

Event

……

Subscriber Callback

Subscriber Callback

Subscriber Callback

Subscriber Callback

Core Manager

Command Module

Page 35: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Resource and Schedule Manager

Module

Instruction Module

Router Route Resource

Instruction Q

Resource Instruction Q

Resource Instruction Q

Add Request

…Event

Manager

Core Manager

Command Module

Resource Dispatcher

Resource Dispatcher

Resource Dispatcher

Page 36: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Engine Demonstration ● WebGL, WebSockets, Web Workers ● HTML5 Audio ● Thread Controller

●  Networking and Physics ● Node.js

●  JaHOVA OS Server Module ●  WebSocket - SocketIO

● Developed in under a week

Page 37: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games
Page 38: Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScript To Connect Native and Browser-Based Games

Final Thoughts ● Initialize Threads at Startup ● Initialization Timing

●  Serialize for dependencies and registration ● Careful with Debuggers and Web Workers ● See more at

●  http://jahovaos.com : Descriptions and Blog ●  http://demo.jahovaos.com : Code

● Expo Floor 2-4 on Wed @ DeVry Booth