<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<HTML>
<HEAD>
<STYLE>
body {
font-size: 7pt;
font-family: Arial;
}
</STYLE>
</HEAD>
<BODY BGCOLOR="#323232" TEXT="#EEEEEE" LEFTMARGIN="15" TOPMARGIN="15">
<IMG SRC="airidle1.png" ALIGN="LEFT">
<FONT SIZE="2">
The framerate of your application refers to how often the windows of your application are refreshed (the stage is redrawn on screen). 
With a framerate of 24, the content of your app is refreshed every 41ms (24 times per second). The framerate also defines how often 
the ENTER_FRAME event handler is invoked.  If you build a Flex-based application, the framerate by default will be 24.
<BR><BR>
Arno Gourdol, Sr. Engineering Manager on the Adobe AIR team, has created a sample application that demonstrates
a technique for lowering the framerate when the application is in the background.  The project file can be downloaded by clicking the 
DOWNLOAD button above.  The source is below.
</FONT>
</BODY>
</HTML>