This document discusses porting C++ applications to Adobe Flash using FLASCC (Flash Alchemy). It provides an overview of FLASCC and the 7 step process for porting an application. It also discusses some challenges faced, including limitations of the threading implementation, debugging difficulties, and memory issues.
1 of 22
Downloaded 46 times
More Related Content
Porting C++ apps to FLASCC
1. Porting C++ based Apps to Flash
using FLASCC
Pavel Nakaznenko, 2013
p.nakaznenko@gmail.com
2. This presentation is about
Adobe Flash AlchemyFLASCC technology
Porting application to Flash with FLASCC
Problems I've faced
3. 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
4. Adobe Flash 11.4
3D Hardware acceleration
Shader support
Multi-threading
5. 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?
7. 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
8. 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.
9. Porting to flash in 7 steps
1) 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!
10. 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 - HLSLGLSL like shading language
P-threads, OpenMP supported
GDB for debugging
Scout for code, memory, Stage3d profiling
11. 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
12. 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)
13. 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)
14. ES2API
or speaking of wrappers pt. 2
Wraps Stage3D API around GLES1.0 API
Part of Adobe in-house codebase (not available
for public)
Still WIP
15. 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
16. Problems I've faced
Worker can not access Stage3d
Worker can not perform IO 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
17. 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;
18. 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
19. 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!
20. 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