Download - Porting C++ apps to FLASCC

Transcript
Page 1: Porting C++ apps to FLASCC

Porting C++ based Apps to FlashPorting C++ based Apps to Flashusing FLASCCusing FLASCC

Pavel Nakaznenko, 2013Pavel Nakaznenko, [email protected]@gmail.com

Page 2: Porting C++ apps to FLASCC

This presentation is about

Adobe Flash Alchemy\FLASCC technology Porting application to Flash with FLASCC Problems I've faced

Page 3: Porting C++ apps to FLASCC

Adobe Flash

Cross-platform multimedia technology Vast userbase, broad platforms coverage Flash Player – standalone or plug-in AVM2 – ES4 based JIT VM AVM2 executes SWF bytecode

Page 4: Porting C++ apps to FLASCC

Adobe Flash 11.4

3D Hardware acceleration Shader support Multi-threading

Page 5: Porting C++ apps to FLASCC

C++ to Flash – How?

Porting manually = very long and resource demanding process

Converting logic code to AS3 (CodeGen) + Flash Wrapper = very error prone

Other ways?

Page 6: Porting C++ apps to FLASCC

Answer: LLVM!

Page 7: Porting C++ apps to FLASCC

LLVM – low level virtual machine

RISC-like language independent instruction set and type system

Link time optimization, Compile time optimization

Plenty of back-ends: x86, x86_64, AMD64, PowerPC, MIPS, partially ARM

Many front-ends: C++, ObjC, Fortran, Ada, Haskell, Java, Python, Ruby, AS3, GLSL, D, Rust and more is coming

Page 8: Porting C++ apps to FLASCC

Adobe FLASCC (Alchemy)

Compiling C++ code into low level virtual machine (LLVM) bytecode

Performing LLVM compile- and link-time optimization

Compiling LLVM bytecode into AVM2 bytecode

Processing resulting files with Flash Compilation Pipeline as usual.

Page 9: Porting C++ apps to FLASCC

Porting to flash in 7 steps1) Download FLASCC sdk

2) Follow ReadMe installation instructions

3) Use tutorials to setup basic I/O, threading and rendering

4) Create makefile

5) Use Scout to profile

6) Use GDB to debug…

Profit!

Page 10: Porting C++ apps to FLASCC

FLASCC features at glance

GCC based toolset + Cygwin in redist

Some libs have been already ported: SDL, zlib, vorbis ogg, box2d, libqren, Bullet, Lua, etc. See Adobe website for details

Hardware accelerated 3D via Stage3D calls

GLS3D – OpenGL-like wrapper for Stage3D API

AGAL - HLSL\GLSL like shading language

P-threads, OpenMP supported

GDB for debugging

Scout for code, memory, Stage3d profiling

Page 11: Porting C++ apps to FLASCC

Not as good as it looks

Very raw technology stack Tools fall out with OutOfMemoryException when

trying to build debug version of big project (the size of UE3).

One line of code change in .cpp = 15 minutes build for big projects. Think carefully before you build!

Profiling tool wasn't working till the very end of integration

Page 12: Porting C++ apps to FLASCC

Not as good as it looks – part two

Growing Pains – claimed functionality doesn't always work

No AVM2 low-level multi-threading support Significant overhead for threads and memory sharing Still have to convert content yourself Have to write a lot of wrappers (RHI, I/O, Net etc)

Page 13: Porting C++ apps to FLASCC

VFS or speaking of wrappers

VFS – Virtual File System, unified way to load files and stay POSIX compliant

Part of FLASCC sdk guidelines Flash is not permited to perform arbitrary I/O You decide how to populate it: embed data or

load run-time FLASCC provides implementation for common

cases (Web storage, Local Shared Object, Embedded storage)

Page 14: Porting C++ apps to FLASCC

ES2APIor speaking of wrappers pt. 2

Wraps Stage3D API around GLES1.0 API Part of Adobe in-house codebase (not available

for public) Still WIP

Page 15: Porting C++ apps to FLASCC

Adobe Flash Threading Implementation Specifics

Back-end: Bytecode is compiled into separate blob, which runs on new instance of AVM2 in the background.

Front-end C++ : POSIX compliant thread functionality (pthreads)

Available atomic operations: __sync_*** family

Front-end AS3: Worker, Mutex, Condition classes (flash.concurrent package)

The Flash Player runs on UI (Primordial) thread

Game code entry point could be reached two different ways: startBackground and startAsync

Page 16: Porting C++ apps to FLASCC

Problems I've faced

Worker can not access Stage3d Worker can not perform I\O with filesystem, due to

sandbox restrictions Entry point can not be called with startBackground

due to the bug with static object construction. Memory sharing comes via messaging = have to

serialize your object and de-serialize it every time you want to change the data

Memory copy and access impersonation are only viable options

Page 17: Porting C++ apps to FLASCC

Problems I've faced – pt. 2 Start application with startAsync, spawn game thread in entry point

(workaround for startBackground problem)

Every call for an impersonation gives overhead of 16ms avg.

while (true); on UI thread locks the whole Flash Player

To impersonate call you have to wrap the function you would like to be executed on behalf of another thread as void* function(void *args);

Severe memory fragmentation due to small allocation and Flash Player GC (Mark & Sweep)

Low memory limit – approx 600 Mb for app, 1.4Gb for Player (Windows)

No memory page protection. This will work: *((int*)0) = 100;

Page 18: Porting C++ apps to FLASCC

Debugging (general)

GDB support only for small-scale projects No debugging possible for big codebase. So no

breakpoints, step-by-step, etc Tons of inline_as3(“trace((new Error()).getStackTrace());\n”); Use your brain. Because any build takes at least

15 minutes. Watch flash log with “tail” like programs, i.e.

“Baretail”

Page 19: Porting C++ apps to FLASCC

Debugging (rendering)

Flash Stage3D uses DirectX driver on Windows platform

Stage3D API calls ≈ DirectX API calls AGAL ≈ HLSL Windows Standalone Flash Player is an

ordinary DirectX based application Use PIX to debug rendering!

Page 20: Porting C++ apps to FLASCC

Profiling

Adobe Scout profiling tool Requires -advanced-telemetry flag to be passed

to compiler (will be supported in later drops) Python script is used to add telemetry flag. Allows rendering, memory, calls, display lists

profiling. Supports threads. Sometimes may be used for debugging

Page 21: Porting C++ apps to FLASCC
Page 22: Porting C++ apps to FLASCC

Bonus links

http://www.adobe.com/devnet/games/articles/compiling-opengl-games.html

http://gaming.adobe.com/technologies/flascc/

http://blogs.adobe.com/flascc/

https://github.com/alexmac/alcexamples

https://github.com/alexmac/alcextra

https://github.com/adamcath/telemetry-utils

https://github.com/alexmac/

http://www.baremetalsoft.com/baretail/