1 / 29

Sweating the Small Stuff

Sweating the Small Stuff. Optimization and tooling. FCNY July 2010. Machinarium. Here's what this talk is about. AS3 is only a tool Apparat and TDSI Wireworld code remap example Adding your Tools to a Build Process Q & A Kumbaya. AS3 ≠ Flash. Many languages can script SWFs

amanda
Download Presentation

Sweating the Small Stuff

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Sweating the Small Stuff Optimization and tooling FCNY July 2010

  2. Machinarium

  3. Here's what this talk is about • AS3 is only a tool • Apparat and TDSI • Wireworld code remap example • Adding your Tools to a Build Process • Q & A • Kumbaya

  4. AS3 ≠ Flash • Many languages can script SWFs • AS3, MXML, AS2,HaXe, C, C++, Lua… • Different reasons to use each one • AS3: common • Alchemized C: runs fast, but hard to write • HaXe: runs fast, targets practically everything • (Tramp.)

  5. AS3 ≠ Flash • Did you know? • Alchemy C code can run at 30% the speed of native C code • AS3? 3% • Use the tools at your disposal • Pick the right tools for the right job • You can use more than one at a time, you know

  6. Apparat • Behind Audiotool • Joa Ebert • TAAS – bytecode analyzer, optimizer • Stripper – removes SWF debug data • Reducer – compresses PNGs in SWFs • Concrete – lets you implement abstract classes • Coverage – unit testing thingy • TDSI

  7. TDSI • It's a car modding term. • We're not supposed to get it. • Finds slow "dummy code" in your SWF that you deliberately placed in your AS3 • Replaces them with Alchemy opcodes • Fast Math replacement • Memory system • Inlining and macros • ?

  8. So here’s what we’re going to do We’ll start with a slow AS3 app and improve it in stages. Generally applicable strategies for optimization

  9. Wireworld in a nutshell • Particle system… but stuck in a grid • Information leaks from pixel to pixel • Instead of • particle.move(); particle.drop(); • It’s • pixel.countNeighbors(); pixel.changeColor(); • Supports circuit-like systems • WW computer by Owen and Moore (Quinapalus.com) • wireworldAS3 (Google Projects) • I get a lot of attention from Germans…?

  10. Wireworld in a nutshell

  11. DISCLAIMER • wireworldAS3 is needlessly complicated. • Show and tell • This complexity isn’t required from your own projects. • the Apparat project contains some example code that may be easier to follow at home

  12. Naïve implementation for ( every row ) { for ( every column ) { there is a pixel. for ( every neighbor of the pixel ) { do something. } update the pixel's state. } }

  13. Naïve implementation • Result: sucks • Slow, slow, slow, slow. • Touching every pixel seems dumb

  14. New idea • List the pixels (or nodes) that might change theirneighbors for ( each node in the list) { for ( each neighbor of the node) { if ( the neighbormight change its neighbors next time ){ add it to a new list } update the node } } Then swap the old list with the new list. • Way less work

  15. Linked List instead of Array • Arrays • untyped(slow) • ordered (unnecessary) • weird • push() and pop() are expensive and lame

  16. Linked List instead of Array • Linked lists are easy: every node points to the next node in the list • start  node  node  node  node  null • Chop it and you get two LLs • Connect their ends and they’re one again • No pushing or popping • No class • Result: better

  17. Let’s take a breather • Grab that second beer. • Optimization is never an end unto itself • It’s so easy to forget that • Performance matters in four or five situations: • Addressing bad user experience, freezing process • Facing stiff competition • Porting code to mobile devices • plotting world domination • Otherwise, don’t we all have enough on our plates already?

  18. Are there any other bright ideas? • How about filters? Pixel Bender? • Wireworld rule is basically a weird BitmapFilter • These work, but they're slow • Remapping to these is scary • Some tasks can be PBJ'd, but not all of them • Result: disappointing

  19. Property Vectors instead of objects • Make a Vector for each node property • xVec, yVec, stateVec • node.next.x becomes xVec[ nextVec[ i ] ] • Replaces the node class withints, Booleans and other Vectors • The Vectors don't grow or shrink, but the data changes its value • Nodes now point to each other with anindex • The linked lists are still in there

  20. Property Vectors instead of objects • Wait! We can't use null. • You have to make a custom null. Call it something else. Nada. Diddly. Buggerall. Squat. Bupkis. • It’s just an int, like -1, that we use to signify nothingness. • Doesn’t work well with dynamic properties • There are ways around this • Maybe you shouldn’t be using dynamic properties • Result: on par with linked lists • Main advantage: all the data is primitive.

  21. ByteArray time • We can pack our primitive data into a BA • Write out the values of each property for each cell, same order every time. • Result: • SUCKS!

  22. Wait. What??

  23. Wait. What?? • BAs + [your project] = SUPAH FAST!!!1 • Dopes.BAs aren’t a cure-all. • ByteArray.position • Like a needle on a record player or hard disk • It’s fast, as long as you don’t lift that needle • BAs in AS3 will perform well for you in many cases, just not all cases • TDSI manipulates BAs with Alchemy opcodes, not the BA methods

  24. Finally, the TDSI step • Use TDSI’sMemory API • Slows your program way down at first • (Don’t freak out) • Run the SWF through TDSI • Result: Excellent

  25. Bonus: green threads • Cut a big loop into a repeatable task • Perform the task in response to a timed event • Stop the task when the loop test fails • Overdrive • Packing the flash event loop • Frameratethreshold • Don’t forget to solve the problem

  26. Was all that really worth it? • Wireworld won’t impact most people. • Other systems can seriously benefit • Audio players/synths • Emulators • Graphics engines • Solvers • Tough stough

  27. Was all that really worth it? • Consider: • This is probably the most efficient SWF we've ever compiled during a talk at FCNY • Hard task • Runs fast • Targeting mobile devices • Your app will stand a better chance • (Apparently WW already runs nice on Froyo)

  28. Fittingtools like TDSIinto your workflow BASH BAT • Bash script / Bat file • Write it just once • Tack it on the end of your FB builders list • Register it as an external build tool • Most IDEs offer some way of doing this • Double click it • Ant build for Eclipse fans • AGAIN: implementation before optimization

  29. That’s it. Please direct all your questions to Hudson. Thank you.

More Related