Runtime code execution fundamentals

One key to understanding how to improve application performance is to understand how the Flash Platform runtime executes code. The runtime operates in a loop with certain actions occurring each “frame.” A frame in this case is simply a block of time determined by the frame rate specified for the application. The amount of time allotted to each frame directly corresponds to the frame rate. For example, if you specify a frame rate of 30 frames per second, the runtime attempts to make each frame last one-thirtieth of a second.

You specify the initial frame rate for your application at authoring time. You can set the frame rate using settings in Adobe® Flash® Builder™ or Flash Professional. You can also specify the initial frame rate in code. Set the frame rate in an ActionScript-only application by applying the [SWF(frameRate="24")] metadata tag to your root document class. In MXML, set the frameRate attribute in the Application or WindowedApplication tag.

Each frame loop consists of two phases, divided into three parts: events, the enterFrame event, and rendering.

The first phase includes two parts (events and the enterFrame event), both of which potentially result in your code being called. In the first part of the first phase, runtime events arrive and are dispatched. These events can represent completion or progress of asynchronous operations, such as a response from loading data over a network. They also include events from user input. As events are dispatched, the runtime executes your code in listeners you’ve registered. If no events occur, the runtime waits to complete this execution phase without performing any action. The runtime never speeds up the frame rate due to lack of activity. If events occur during other parts of the execution cycle, the runtime queues up those events and dispatches them in the next frame.

The second part of the first phase is the enterFrame event. This event is distinct from the others because it is always dispatched once per frame.

Once all the events are dispatched, the rendering phase of the frame loop begins. At that point the runtime calculates the state of all visible elements on the screen and draws them to the screen. Then the process repeats itself, like a runner going around a racetrack.

Note: For events that include an updateAfterEvent property, rendering can be forced to occur immediately instead of waiting for the rendering phase. However, avoid using updateAfterEvent if it frequently leads to performance problems.

It's easiest to imagine that the two phases in the frame loop take equal amounts of time. In that case, during half of each frame loop event handlers and application code are running, and during the other half, rendering occurs. However, the reality is often different. Sometimes application code takes more than half the available time in the frame, stretching its time allotment, and reducing the allotment available for rendering. In other cases, especially with complex visual content such as filters and blend modes, the rendering requires more than half the frame time. Because the actual time taken by the phases is flexible, the frame loop is commonly known as the “elastic racetrack.”

If the combined operations of the frame loop (code execution and rendering) take too long, the runtime isn’t able to maintain the frame rate. The frame expands, taking longer than its allotted time, so there is a delay before the next frame is triggered. For example, if a frame loop takes longer than one-thirtieth of a second, the runtime is not able to update the screen at 30 frames per second. When the frame rate slows, the experience degrades. At best animation becomes choppy. In worse cases, the application freezes and the window goes blank.

For more details about the Flash Platform runtime code execution and rendering model, see the following resources: