33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized...

51
33 milliseconds in hell Damn you 30 fps!

Transcript of 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized...

Page 1: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

33 milliseconds in hellDamn you 30 fps!

Page 2: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

www.derschmale.comwww.away3d.com@DerSchmale

David Lenaerts

Page 3: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Introduction33 milliseconds in hell

Brief summaryReal time effects: 30 – 60 fps

Limitations Flash Player (oldskool, yo)

Tips & tricks

Mindset

Examples + demos

Page 4: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Commodore 64 (BASIC) PC

Doom, Quake, ...id Software nut: Carmack FTW (@ID_AA_Carmack)90's PC demo scene

Real-time effects2D & 3D graphical programming

Turbo Pascal, C/C++ (DOS: 0xa000)

Flash MXjust like the old days

IntroductionOff the beaten path

Down memory lane

Page 5: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

2D + 3D graphical effects

Visual simulations

ActionScript / Pixel Bender / C++ (Alchemy)

Creating visual effects, not art

Introduction33 milliseconds in hell

The present

Page 6: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

The boring bits33 milliseconds in hell

Page 7: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

IntelliJ, FDT, Flash Builder, ...

Productivity: code less, think more

Refactoring support + code generation

Overview on code

Profiler (Flash Builder, FDT)

Toolset33 milliseconds in hell

IDE

Page 8: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Version: 9 vs 10 vs 10.1

Convince your clients!

Debug vs Release Player

Toolset33 milliseconds in hell

Flash player

Page 9: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Toolset33 milliseconds in hell

Other toolsPixel Bender toolkit / Joa Ebert's PBDT

http://blog.joa-ebert.com/pbdt/

Alchemy

Joa Ebert's Apparat suitehttp://apparat.googlecode.com

Know your tools!

Page 10: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Recursively divide an expensive task in smaller sized subtasks

Divide → Solve → Combine → Conquer

Example: merge sort

Conceptual33 milliseconds in hell

Divide & Conquer vs Brute Force

Page 11: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Conceptual33 milliseconds in hell

D&C: Merge sort

Page 12: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Conceptual33 milliseconds in hell

Get lazy, escape earlyAvoid expensive tasks: is the task even necessary?

Check necessity with a cheaper test(s)

Example:

Which of 100 objects am I hitting?

→ Am I even CLOSE to an object?

Page 13: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Conceptual33 milliseconds in hell

Get lazy, escape earlyCan work even better with Divide and Conquer approach

Page 14: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Conceptual33 milliseconds in hell

Get lazy, escape earlyCan work even better with Divide and Conquer approach

Page 15: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

The fun bits33 milliseconds in hell

Page 16: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Faking it33 milliseconds in hell

You faked it?!Of course: All real time effects are fake in a sense

Creating something that works with strict preconditions

Baked lighting (Away3D + Prefab3D)

Casting shadows

Page 17: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Surmounting scale33 milliseconds in hell

Render loop

Page 18: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Surmounting scale33 milliseconds in hell

Render loopTransform and projection cost increases per vertex

Sort and draw cost increases with triangle count

In a huge scene, we're screwed, right?

Page 19: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Surmounting scale33 milliseconds in hell

Binary Space Partitioning (BSP)No sorting

Divide & Conquer

Split scene recursively until we have parts that need no sorting

Simply draw parts in correct order

Precomputed

Also speeds up collision detection

Page 20: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 21: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 22: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 23: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 24: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 25: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 26: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 27: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 28: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Surmounting scale33 milliseconds in hell

Potentially Visible Set (PVS)Early escape: reduce triangle and vertex count

Which parts in a BSP tree could never be seen from other parts?(per part: simply keep lists of potentially visible parts)

Find the part containing the camera

Only render the parts in the visibility list

Page 29: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 30: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 31: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 32: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 33: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 34: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 35: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33
Page 36: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Surmounting scale33 milliseconds in hell

BSP/PVS in Away3DObsolete on desktop

Great for Flash!

Generated by Prefab3D

http://www.closier.nl/prefab/

http://www.influxis.com/battlecell/

Page 37: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Pixel bender33 milliseconds in hell

Pixel Bender basics0 or more images → 1 output image

Function per output pixel (so no random access)

Multicore

Can apply it as filter to Flash 3D

Page 38: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Pixel bender33 milliseconds in hell

Away3D shaders

Apply Pixel Bender on a texture

Position and direction data needed,encoded in bitmaps (rgb ~ xyz)

Problem: only static meshes

Page 39: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Pixel bender33 milliseconds in hell

Away3D shaders

Page 40: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Pixel bender33 milliseconds in hell

Dynamic meshes

Procedurally generating position map

Calculate normal map from that

Update mesh according to position mapl

Page 41: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Pixel bender33 milliseconds in hell

Chaining

Chain together several pixel bender effects

Output previous effect is next input

Field-based physic simulations

Page 42: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Pixel bender33 milliseconds in hell

Isosurfaces

Surface of equal values

Cfr weather report (2D)

Page 43: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Pixel bender33 milliseconds in hell

Marching cubes

Don't use Pixel Bender to output image

Number crunching (isovalues, surface normals, ...)

Procedurally create triangles

Order of triangle creation → no sorting or transform needed

→ much higher polycount

Also check: Frank Reitberger – http://prinzipiell.com/

Page 44: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Pixel bender33 milliseconds in hell

Marching cubes: render loop

Demo: Metaballs / Julia Set

Page 45: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Alchemy33 milliseconds in hell

Adobe Alchemy

Compile C/C++ code to ABC

Access fast memory

GCC/G++ does a lot of code optimizing

Page 46: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

The last bits33 milliseconds in hell

Page 47: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

What, when, how33 milliseconds in hell

What to optimizePretty code vs fast code

Inlining methods1-lining statements

Algorithms/Data structuresThe bigger pictureDivide & ConquerTree structures (BSP, Quadtree Raytracer)Can have most impact on performance

Page 48: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

What, when, how33 milliseconds in hell

When to optimizePretty code vs fast code

Wait as long as you canWhen it works

Algorithms/Data structuresUp front“This is going nowhere”Changing tools can cause change of algorithms

Page 49: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

The devil in the 9th circle33 milliseconds in hell

WorkflowDesigners vs Developers

Sit together from the get-go

A linear hand-over approach does not work

Give and take

Mediator: director

Page 50: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Closing off33 milliseconds in hell

Evoflash – Spiral OutSimo Santavirta – http://www.simppa.fi

Evoflash – http://evo.bombsquad.org

Real-time “demo-scene” demo in Flash

#1 at Assembly 2010 \m/

Page 51: 33 milliseconds in hell - derschmale.com · Recursively divide an expensive task in smaller sized subtasks Divide → Solve → Combine → Conquer Example: merge sort Conceptual33

Thank you!33 milliseconds in hell

Questions?

David Lenaertswww.derschmale.com

twitter.com/DerSchmale