Minko - Flash Conference #5

Preview:

Citation preview

Flash Online Conference #5

Targeting mobiles, WebGL and Stage3D... with a single app!

@Minko3D http://minko.io

LATEST ADDITIONS Available today on minko.io

New Editor Features

Dynamic framerate

Multi-selection

First-person camera mode

New layer WYSIWYG interface

Integration of CrystalATF – 6 to 9x faster ATF conversion – Only for texture loading in the editor, not yet for publishing

Minor bug fixes…

New Framework Features

Support for 4096 textures

Context-loss handling

Compatibility with 2D frameworks (Starling…)

Minor bug fixes…

New Community Features

Better search engine for the forum

Already existing threads suggestions when your create a new one – Avoid asking questions that have already been answered

Discussions feed available directly from the blog’s right

column

New Game Released: IronForce

Published by EA/Chillingo – http://www.chillingo.com/games/iron-force/

Tank MMORPG

– Already available on iOS – Available soon on Android

New Game Released: IronForce

« We chose Minko to be the 3D engine in one of our new Flash-based games because we think it’s a highly professional Stage3D based solution

in terms of development ecosystem and high performance. »

André Weissflog, Head of Development at BigPoint

MINKO 3 Codename « Normandie »

Motivations

Target new platforms – Keep the « design once, deploy everywhere » workflow – Larger community

Increase performances, epecially CPU-wise

– Multi-threading?

Leverage existing codebase

New Platforms

Platform Status Target Languages

iOS OK Native C/C++

Android OK Native C/C++

Flash (Stage3D) WIP X-Compilation C/C++, AS3

Windows (DirectX) WIP Native C/C++

Mac OK Native C/C++

Windows (OpenGL) OK Native C/C++

Linux OK Native C/C++

HTML5 (WebGL) OK X-Compilation C/C++, Javascript

Windows Phone WIP Native C/C++

BlackBerry 10 NA Native C/C++

Firefox OS NA Native C/C++

Current status

Feature Status Comments

Signals 100%

Scene Graph 90% Assets loading, scene manipulations, signals, layers

Post-Processing 30%

Effects/Shaders 100% Vertex/fragment shaders, effects parser, render to texture, multi-pass

Über shaders 80% Init. OK, but won’t fork automatically afterward

Dynamic lights 100% Ambient, directional, point and spot lights

Dynamic shadows 50%

Particles 90% Missing some modifiers

Physics 90% Missing joints, triangle collider and heightmap collider

MK files parser 80% Missing compression

JPEG parser 100%

PNG parser 100%

Collada parser NA

OBJ parser NA

About Collada and OBJ

Might be supported in the future as a plugin using the ASSIMP project

Still supported in the editor to be exported as MK – Smaller files – Faster to load – More features (physics, particles…)

TECHNOLOGICAL CHOICES

WebGL

In the browser implementation of the OpenGL API – Based on the specifications of OpenGL ES2 (like Stage3D!)

Supported by most modern browsers

– Supported by IE11 next year!

Not as fast as Stage3D – But that’s another story…

53%

WebGL

96%

Flash

WebGL VS Stage3D - Penetration Rate

Firefox 4+, Chrome 9+ Any browser with Flash 11+

Source: Statcounter

?

WebGL

96%

Flash

WebGL VS Stage3D – HW Compatibility

*

* 2006 and newer hardware, software fallback otherwise

WebGL => Flash Fallback!

Start working with standards today, but keep adressing the largest audience possible

Is WebGL

available?

Run WebGL/JS app.

Run Flash app. no

yes

C++ 2011

Standard, fast, well documented and supported by a vast community

Already fully supported by all major compilers (VS, GCC, LLVM…)

New additions make it closer to what we’re used to with AS3/Javascript – Closures/lambda functions – Type inference (instead of dynamic typing) – Shared pointers

FlasCC/Crossbridge http://adobe-flash.github.io/crossbridge/

Open source project driven by Adobe – Based on LLVM, which is supported by Google, Apple, Intel and

many more

Cross-compiles C++ code to ActionScript 3.0 – No (stable) OpenGL bindings – Provides virtual file system – C++ AS3 bindings using SWIG

Leverages LLVM/C++ based optimizations

– Strong typing – Low level memory management: no GC!

Still suffers from AS3/AVM2 performance issues

Emscripten https://github.com/kripken/emscripten

Open source project driven by Mozilla – Based on LLVM, which is supported by Google, Apple, Intel and

many more

Cross-compile C++ code to Javascript code – Binds OpenGL to WebGL – Provide virtual file system – C++ Javascript bindings

Code optimizations

– Closure compiler – asm.js (2x performances of native code!)

Code compression using LZMA

ANGLE https://code.google.com/p/angleproject/

Almost Native Graphics Layer Engine

Open source project driven by Google – Used by Chrome and Firefox WebGL implementations

OpenGL wrapper that will map OGL calls to the DirectX API

– Provide better performances on Windows – Makes it possible to target DirectX with an OpenGL based

implementation – Should provide Windows Phone 8 compatibility out of the box

Also converts GLSL shaders to HLSL

– Completely transparent to the developer! – Write once, deploy everywhere

Premake http://industriousone.com/premake

Cross-platform build system – Windows, Mac and Linux – Reference in the video game industry – Well documented

Compatible with most IDEs/tools

– gmake – Visual Studio – XCode

Easy to extend and customize

– Based on LUA script configuration files – Adding support for emscripten was easy

Vagrant http://www.vagrantup.com/

Goal: easily cross-compile without installing/configuring complicated stuff

Virtualized build environment – Based on VirtualBox – Will install and bootstrap everything for you – Will auto-update itself to make sure you always use the latest

stable toolchain

We provide the configuration file to compile to HTML5/WebGL in just a single command line! – Ubuntu virtual machine – Uses Premake4 + gmake – Will do the same for Flash/Crossbridge

IMPLEMENTATION

AbstractContext

Mimics flash.display3D.Context3D interface – Leverages Adobe’s work on wrapping DirectX/OpenGL – Mainly uses simple native types (int, float…) to make it easier to

wrap/bind in multiple languages

Defines all you need to work with OpenGL ES 2-compliant APIs – Enforces compatibility – Can be extended to provide more « custom » capabilities if you

want

AbstractContext OpenGLES2Context WebGLContext

OpenGLES2Context

Extends AbstractContext

Implement all required methods using the OpenGL API

Actually uses OpenGL bindings, but limited only to what is actually available in OpenGL ES 2 – Should work out of the box with any OpenGL ES 2 compliant

implementation – But also on any OpenGL implementation (ex: Windows, Mac and

Linux)

AbstractContext OpenGLES2Context WebGLContext

WebGLContext

Extends OpenGLES2Context – Actually inherits more than 95% of its code

Override a few methods to handle some minor WebGL qirks

– Some methods do not work properly/exist and have to be wrapped using (simple) workarounds

AbstractContext OpenGLES2Context WebGLContext

NEW FEATURES

Components

Goal: provide an extensible API to add behaviors to scene nodes with concepts shared by artists and developers

Replace « controllers » – Scene nodes just describe a hierarchy – Components add behaviors

One scene one can have multiple components

– Ex: the scene node of a torchlight can have a component for the mesh and a component for the actual light source

Components – Ex: Directional Light

The Transform component is not mandatory – Scene nodes do not necessarily have a 3D transform: lighter and

more customizable – Yet our directional light is pointless without a configurable

direction…

Components – Ex: Camera

Our camera has 3 components: – Transform will make our Camera position/orientation customizable – PerspectiveCamera will provide actual camera related data to

the rendering API – Renderer will do the actual DrawCall storage/frame rendering

GLSL

Support for GLSL 1 as defined by the OpenGL ES 2 standard – Vertex shaders – Fragment shaders

Implementation could easily support earlier/more powerful

versions of GLSL – Gives you the ability to leverage extended hardware capabilities

when available!

Vast codebase, tutorials and various documentation articles available on the web

Shader Optimizer

Open source project created by Unity – Used by default since Unity 3 – Based on Mesa’s GLSL compiler open source implementation

Provides significant performance boost on mobile GPUs

– Compensate the lack of proper drivers on both iOS and Android

Completely transparent to the user: you don’t have to do anything – JIT optimizations

Not working with WebGL (yet!)

Effects

Data-driven API to create rendering effects – Everything defined in JSON data files – Loaded natively by the core framework – Interact seemlessly with the scene and the existing assets/effects

Create even the most complicated effects without a single line of C++

code – Only GLSL and some flags/properties to setup – Support every rendering states/properties you might need: blending,

filtering, render target, etc… – Both rendering and post-processing – Techniques and fallbacks (WIP)

Dependencies injection to create libraries of re-usable GLSL

shader functions – Ex: Phong.glsl gives you everything you need to implement Phong

lighting

Effect Bindings

Goal: copy/paste existing GLSL code and « plug it » in the engine without a single shader code modification

Declare « links » between effect/shader « properties » and what is actually provided by components in the scene – Uniforms – Vertex Attributes – Macros

Makes it possible to have macros that will be defined only if

some scene/component properties actually exist – Uber shaders!

CROSS-COMPILATION WORKFLOW

Minko Minko Sources

Compilation

C++ app. code

Plugins C++ Code

Physics

Particles

JPEG Parser

PNG Parser

MK Parser

Core framework C++ code

Plugins Static Libraries

Physics

Particles

JPEG Parser

PNG Parser

MK Parser

Core framework static library

App. object file

ASM.js Javascript code

C++ 2011 code

Linkage

Minko

Plugins Static Libraries

Physics

Particles

JPEG Parser

PNG Parser

MK Parser

Core framework static library

App. object file

application.js

Optimization

Run the closure compiler on the generated Javascript code

application.js application_optimized.js

Workflow - Compression

Use LZMA compression – Emscripten will embed LZMA decompression code all by itself – Decompression can be watched when the app. runs

application.js application_compressed.js

EXAMPLE: SPONZA HTML5! http://minko.io/showcase/sponza-html5

My Feedback – The Good Parts

Working with C++ 2011 is amazing – More complex but so much powerful/expressive than AS3/JS – Useful and reliable STL containers (list, maps, sets, etc…) – Shared pointers make memory management just as easy as with

managed languages: not a single memory leak so far!

Visual Studio/XCode are very good IDEs

Minko 3’s implementation is much lighter and yet just as much powerful

Vagrant + Premake provides an efficient build system with cross-compilation

My Feedback – The Good Parts

Compatibility – The app runs on Windows, Mac, Linux and WebGL withouth a single

modification! – Haven’t tested iOS/Android yet, but should work out of the box

Binary size

– Closure compiler will make the binary 2 to 3x lighter – LZMA compression will make the binary 5 to 6x lighter – Combine both to get a final binary even lighter than the native one!

Speed

– 2x speed of native code thanks to asm.js! – Possiblity much faster than an AS3 implementation

Integration

– Emscripten « modules » system make it easy to generate a *.js file and run it in any web page

My Feedback – The Bad Parts

Workflow – Haven’t figured out how to make dynamic libraries for now

Speed

– WebGL API is the bottleneck

Memory consumption – 256MB of required memory seems excessive (I haven’t make a

comparison with AS3 so far though…)

I miss the Flash API – How do to a 2D UI using HTML5 comps? – URLRequest?

Conclusion

C++ 2011 is very efficient to build interactive and rich apps

Emscripten is mature enough to start working on large-scale applications

Using #ifdef for portability of C++ code is a bit cumbersome – But it can easily be fixed by wrapping the app. init

Minko 3

– Alpha in september – Beta in december – Final release in April 2014

MERCI ! Don’t forget to check http://minko.io !

Recommended