I was a speaker at this summit both as the owner of TheMiner, and a R&D Architect at Frima studio, and I wanted to talk to you a bit about what was the event, and what (as a developer) I learned there.
But first, you should read the blog post by Thibault to get details about what Adobe learned from the summit (Read This)
This summit was a really good mix between
Speaker: Giving their short/mid/long term feature requests, giving bug report and commenting on better pipe-line solutions
Adobe: Reveling and explaining lot’s of “What’s next” in the form of a mini “Adobe Max Sneak Peaks”
Did you ever attend an Adobe Max Conference Sneak peaks? Pretty cool.
So let’s just follow Thibault post structure:
And I know it’s going to be so disappointing for all you guys…. but here it is!
1. The workflow
- What if you could gain time… lot’s of it..
- What if you could integrate in better ways to your “full pipe-line”…
- What if you artist could stop complaining? (lol)
- What if your compile time would reduce a lot…
- I’m sure you know how many blogs talk about little as3 optimization to make code run faster.
- What if they would become… all… obsolete…
- What if the only performance boost you will get could be from better algorithm?
- What if you could completely trust who’s making the update?
- What if you could really think “Flash is far from dead”
- What if would you’d expect to present to 3 Adobe senior engineer, and you would get 100 engineers in an auditorium, and a whole lot more online in an internal event streaming to all the Adobe employees that can make what’s coming next.
- What if my own skepticism was yelling: “Fuck, they are really serious about this…”
4. Project “Monocle” (As the owner of TheMiner)
- What if the tools they are making could compete to what’s best of other technology?
- What if you could “trust” the data that is being outputted?
- What if the next version of the VM would be built with a lot of telemetry from the scratch?
I guess the most important thing here is commitment.
I worked on flash project and R&D for a very long time now. And all the sudden, they just want to raise that bar to a level you would not expect.
This is a very exiting time for me as, suddenly, I feel like I’m being a key role in what “has been” flash gaming in the past, and certainly in what’s “will be” flash in the future.
I won’t talk about other technology here, but I am now 100% confident that this blog is not soon to be dead.
And if clients come-up and ask “what technology should we use”, I’ll be more than ever happy to answer.
5. Frima Icefield 3D – World Editor Trailer
This is a video made from a couple thing we showed there. (it’s available in 720p)
*please, do not blink your eyes, and crank-up your speaker!*
Thanks for reading, and I hope this all make you really happy.
I just want to give a special thanks to Thibault and the other Adobe folks who made this all possible.
Tutorial: Using the Memory profiler
Most of the time, Flash performance issues come from bad memory management.
Object instantiation take a lot of time, and since FlashPlayer work with a Garbage Collector, having tons of objects can make it go nuts.
Good practice is to remove all instantiation from loops, keep a minimum of object in memory and use serialization and bytearrays to keep some data.
This profiler show you what the VM is reporting as object being allocated and removed (garbage collected).
Here is what the profiler look like:
Since there is a lot of different object type being managed by the VM,
just listing them would make it hard to find specific data.
This input box let you enter any text to filter the visible object using their QName
When the filter search is ON (there is text inside the box), the box appear green,
and only class name with the text in it appear in the list.
The QName is the ClassName with its full ClassPath. the format is ClassPath::ClassName
3. Avg new / frame
When profiling memory, high number of instantiation might be harder to understand.
Having an average instantiation per frame let the developer understand the exact amount of allocation in a single frame
The miner cannot guess all the post-analysis you want to do.
But it does offer you a easy way to save data in a grid format that can be pasted directly in excel
If you need to save the current state, or do graphics using the data in the profiler,
you can use the snapshot button to copy all class to the clipboard with all their numbers.
Reset the current instance count and cumulative instance count for all class.
6. Pause refresh
Toggle button that keep retrieving sampling data, but stop the interface refresh.
7. Added per second(default refresh-rate)
Number of Class instantiated in one second The default refresh rate can be change in the configuration tab
8. Deleted per second(default refresh-rate)
Number of Class being collected by the GC in one second The default refresh rate can be change in the configuration tab
9. Sort by Current Instance Count
Sort by Current Instance Count
10. Current Instance Count
The current instance count is calculated by removing Collected Sample to New Sample.
This number is significant only when the memory profiler continuous profiling is turned-on in the configuration tab
because all sample report must be processed in order to have a good count.
11. Sort by Cummulative Instance Count
Sort by Cummulative Instance Count
12. Cummulative Instance Count
The total number of Instanciation for a given class type.
Released: TheMiner 1.4.00
I’ll skip the usual “we fixed bugs” part, and go straight to what’s new and interesting!
Here is a quick overview of the biggest additions:
A UserEvent is a event created by the developer in the application that will communicate with TheMiner to show up in a specific tab of TheMiner (UserEvent tab).
The event can be pushed to TheMiner in two ways:
- TheMiner.AddBasicUserEvent(aEventName:String = null, aEventValue1:* = null): UserEventEntry
- TheMiner.AddCustomUserEvent(aEventName:String = null, aEventInfo:String = null, aEventValue1:* = null, aEventValue2:* = null, aStatusBarLabel:String = null, aStatusBarProgress:Number = -1, aStatusBarColor:uint = 0xFF000000, aEventSortPriority:int = 0, aEventVisible:Boolean = true, aError:Boolean = false): UserEventEntry
This is what it can look like:
static/dynamic Logging platform
Logging is pretty straight forward? wrong. This can easily become a mess.
In this new version,you can use a sub-set of FlashConsole, well integrated with TheMiner.
using simple command such as
//Simple log TheMiner.Log("My Simple Log"); //Log to a specific channel TheMiner.Log("Simple Channel Log","MyChannel");
//Inspecting(dynamic log) a Class definition TheMiner.Log("Inspecting a class","Inspect"); TheMiner.InspectObject(MyClassToInspect, "Inspect"); //Inspecting(dynamic log) a Object Instance TheMiner.Log("-------------------------------------------"); TheMiner.Log("Inspecting an instance","Inspect"); mObjToInspect = new MyClassToInspect(); TheMiner.InspectObject(mObjToInspect, "Inspect"); //Class to print out class MyClassToInspect public var FirstVar:int = 0; public var SecondVar:String = "foo" }
Better Filtered content
You can now toggle a Permanent Search filters option in the configuration tab
By doing so, any text you enter in a given session inside one of the search box (MemoryProfiler, PerformanceProfiler, LoaderProfiler, UserEvents) will remain active after you close the application, and reloaded when you start a new session.
This way, when you do iterative work on optimizing your application, you don’t have to lo0se time on remembering, and re-entering the same info over and over again.
The Permanent Search Filters are also used when using Raw Data Dumps, this way it’s a lot easier to track down precise information in those huuuge list of info.
Average per frame
Did you ever try to know precisely how much time you function are running?
The Performance profiler now offer a way to make a ratio of time taken by a function over a period, which give you a time that can be calculated in microseconds!
What do we have here….
Each frame, around 23 microseconds is spent in the b2Mat22/Solve function calls
and 0.1 Millisecond in b2Mat22/Set
Do you have a Performance budget? This is the tool you need!
Last but not least: The Resources Grabber
Do you link directly to JPG and PNGs?
Do you load SWF at runtime? encrypted?
The resource grabber feature (in the Loader profiler) can expose, and redirect you directly to file being downloaded , and SWF being loaded by the VM.
If it’s a simple media, clicking in a icon will pop-up a window and show you the file in your browser.
If it’s a SWF, it will ask you to save the SWF bytes in a file somewhere.
The file is the Unpacked, and Unencrypted version of any SWF.
This means you can pass it directly to a decompiler to check the content.
For those who already use TheMiner, you know that these are only little addition compare to what’s already in it.
I suggest you give it all a try to know if you like it! (you will)
In this post he’s profiling two sorting method: native vector. sort, and Skyboy’s fastSort code.
At first I was impressed by the result of Skyboy. Then I realized two things.
First, The flash native sort REALY don’t like Number.infinity, negative infinity.
So when sorting and vector. with these values inside, it’s getting a LOT slower.
Where a standard vector could take 100ms to sort, one with infinity values in it can take up to 2000ms!!
The other thing is fastSort is using void (*) pointer everywhere.
So if we go back a few day to my previous (epic) article , we know that this is a really bad thing when casting from void to Number.
It’s allocating a LOT of memory. (5Mo/Sort on 50K elements)
So I decided to add a few hundreds lines to this class with already a lot of it (fastSort)
I added a specific sorting method for int, uint and Number to manage only typed values.
The reslut is quite amazing!
Native Vector Sort : 100 ms + 400Ko allocation
UnOptimized fastSort : 400 ms + 5Mo allocation
New Optimized fastSort : 20ms + zero allocation
Finaly, just before giving you the code, I want to invite you on a new little forum that focus on Performances, optimization, debugging and multiple other flash hardcore subjects.
Many of the most hardcore dev and blogger I know are already in or are going to join soon, so please be part of this and enjoy posting refreshing and brain teasing content!
The Hardcore flash forum
And now.. the way too many lines of code part:
Have you ever had a memory instantiation problem that was impossible to track down? Here is a post that might help you with that kind of thing!
Beware! This post is very long… but VERY instructive! If you want to learn some internal mechanism of Flash, I strongly suggest you read it from top to bottom without skipping parts!:)
After finding what it was, we can conclude that this is not a real leak but a irritating behaviour of the Flash VM. Still, you should all be aware of it!
Yesterday I was helping Luca (creator of Nape physic engine, made with haXe) to find what seemed to be a big memory leak. There was a couple framework used so it could be directly from Nape… or from Starling… or from debug tool running… or from a port error from haXe…
So I though it was going to be simple
More than two years ago, I made a blog post about how to optimized the existing Base64 libraries.
This library was highly linked and used in multiple project as it’s 100% free (MIT license)
A few days ago I decided to take another look at it just for fun. To see if I could get it to be a bit faster.
Here is some change I made to make it even faster:
I just wanted to let you know that TheMiner remain 100% free for all non-commercial use, but if you like the product and you want to help promote TheMiner, you can become a sale affiliate very easily!
It’s simple as:
-Put TheMiner icon on your website.. or blog.. or forum.. car painting.. cat clothes..
-Earn money if people click and buy the PRO version of this awesome software.
The king is dead:
Yes.. today I have some bad new for you. One of the best flash performance analysis tool: FlashPreloadProfiler, is officialy dead. After a LOT of time developing this profiler for flash. I decided to kill the thing.
Long live the king!
YES! After this much effort, it would be too sad to drop everything. right?
Launching today, TheMiner is the new (FLash Profiling) solution that will take the place of FlashPreloadProfiler, but with a lot of optimization, innovation and new features!
TheMiner is dedicated to every single hard-working developer that are making the most out of what they have by analysing and improving flash application. Every hardcore developer should be proud to be a miner and has such, we decided to make it look like a hero worker.
TheMiner is now part of another entity called Sociodox
The main website as also moved to a new address: http://www.sociodox.com/theminer
TheMiner is now free for any non-commercial use
cost a little something for commercial use.
Let’s give-away a couple COUPON for TheMiner Pro
- ” IAmTheFirstMiner ” : 75% off for the first 3 ppl to buy it!
- ” 0DayCoder ” : 20% off for the first 20 ppl to buy it!
- ” HappyBugFreeChristmas ” : 12% , Everyone deserve a christmas gift!
- ” jpauclair.net ” : You love my blog? Have some percent.
- ” flashpreloadprofiler ” : For the good old time.
You are a blogger? You have a website? Talk about TheMiner or Link to it with TheMiner icons, send me the link and get 50% off!
History: from FlashPreloadProfiler to TheMiner
///////////////////////// // Added: // // One frame Trace of all methods with arguments, file and line. // DebugTexture to see stretch,smoothing, and color variation // Minimize // a QUIT button when profiler is minimed // FPS and Mem in the top bar // Screen Capture (save to file) // Pause interface in Performance & Memory profiler // Filter in Memory profiler // Filter in Function profiler // Filter in Loader profiler // Filter for file errors in loaders // Start Off (off by default) // MouseListener sprites // Usage reporting (Google Analytics) // Interlaced DataDump feature // Visual feedback in memorygraph showing GC time and weight (gray bar) // GC indicator in Flash Statistics // Auto-check update when opening configuration panel // Low process when everything off // Skin Loading / Saving // Flash Player Version in Stats tab // Added a "Already Collected" column to Memory dump // Stage Resolution in FlashStats ///////////////////////// // Fixed: // // wrong DataDump sampling recording status // bad colors for invisible object in Overdraw // bad opacity management of selection highlights // bad priority of preloader (over anything on stage) // bad instanciation for air project // Config are save automaticly when changed // Now using latest version of MonsterDebugger (v3.1) // Loader copy text not always working // Loader won't show url of stream/loader on error // MonsterDebuggerIcon needed tooltip. // multiple TheMiner classes instanciation inside reports. // multiple TheMiner self sampling in dump ///////////////////////// // Optimized: // // a LOT the main loop, now should be pretty smooth to record samples // Huge Rendering optimization in overdraw graph // Huge Rendering optimization in LifeCycle graph // Icons management // Made the bar and spacing a bit smaller
TheMiner has also been translated by the community in 8 languages:
English, French, Russian, Dutch, Spanish, Hindi, Chinese Traditional/Simplified
These ports are inside each build.
TheMiner also come with more support:
A dedicated user group, a whole website with FAQ, support, installation help and more.
14 complete tutorials on how to use most of the features