classes
FrameRateOptimizator.as
Stiahnuť FrameRateOptimizator.as
package sk.yoz.optimization
{
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class FrameRateOptimizator extends EventDispatcher
{
protected var snapshot:BitmapData;
protected var fpsp:uint;
protected var _fps:uint;
protected var fpsTimer:Timer;
protected var root:DisplayObject;
protected var _forceActive:Boolean = false;
protected var _forceInactive:Boolean = false;
protected var _mouseMoveActivation:Boolean = false;
public var frameRateActive:uint = 24;
public var frameRateInactive:uint = 2;
protected var inactivityDelay:uint = 1000;
protected var activityTimer:Timer;
public var debug:Boolean = false;
public function FrameRateOptimizator(root:DisplayObject, frameRateActive:uint = 24, frameRateInactive:uint = 2,
inactivityDelay:uint = 1000)
{
super();
this.root = root;
this.frameRateActive = frameRateActive;
this.frameRateInactive = frameRateInactive;
this.inactivityDelay = inactivityDelay;
root.addEventListener(Event.ENTER_FRAME, rootEnterFrame);
fpsTimer = new Timer(1000);
fpsTimer.addEventListener(TimerEvent.TIMER, fpsTimerHandler);
fpsTimer.start();
activityTimer = new Timer(inactivityDelay, 1);
activityTimer.addEventListener(TimerEvent.TIMER_COMPLETE, activityTimerComplete);
isActive = true;
}
[Bindable(event="fpsChanged")]
public function get fps():uint
{
return _fps;
}
protected function set fps(value:uint):void
{
if(_fps == value)
return;
_fps = value;
dispatchEvent(new Event("fpsChanged"));
}
public function set forceActive(value:Boolean):void
{
_forceActive = value;
if(forceActive)
isActive = true;
}
public function get forceActive():Boolean
{
return _forceActive;
}
public function set forceInactive(value:Boolean):void
{
_forceInactive = value;
if(forceInactive)
isActive = false;
}
public function get forceInactive():Boolean
{
return _forceInactive;
}
public function set mouseMoveActivation(value:Boolean):void
{
if(value == _mouseMoveActivation)
return;
_mouseMoveActivation = value;
if(value)
root.addEventListener(MouseEvent.MOUSE_MOVE, rootMouseMove);
else
root.removeEventListener(MouseEvent.MOUSE_MOVE, rootMouseMove);
}
public function get mouseMoveActivation():Boolean
{
return _mouseMoveActivation;
}
public function set isActive(value:Boolean):void
{
if(value && !forceActive && !forceInactive)
{
activityTimer.reset();
activityTimer.start();
}
frameRate = suggestFrameRate(value);
}
protected function suggestFrameRate(active:Boolean):uint
{
if(forceActive)
return frameRateActive;
if(forceInactive)
return frameRateInactive;
return active ? frameRateActive : frameRateInactive;
}
protected function set frameRate(value:uint):void
{
if(value == frameRate)
return;
root.stage.frameRate = value;
if(debug)
trace("FrameRateOptimizator -> frameRate = " + value);
}
protected function get frameRate():uint
{
return root.stage.frameRate;
}
public function get isActive():Boolean
{
return frameRate == frameRateActive;
}
protected function rootEnterFrame(event:Event):void
{
fpsp++;
if(!isActive && rootChanged)
isActive = true;
}
protected function rootMouseMove(event:MouseEvent):void
{
isActive = true;
}
protected function get rootChanged():Boolean
{
var changed:Boolean = true;
var bitmapData:BitmapData;
try
{
bitmapData = new BitmapData(root.width, root.height);
bitmapData.draw(root);
if(snapshot)
changed = bitmapData.compare(snapshot) != 0;
snapshot = bitmapData;
}
catch(error:Error)
{
snapshot = null;
if(debug)
trace("FrameRateOptimizator -> rootChanged Error: " + error.message);
}
return changed;
}
protected function fpsTimerHandler(event:TimerEvent):void
{
protected::fps = fpsp;
fpsp = 0;
}
protected function activityTimerComplete(event:TimerEvent):void
{
isActive = rootChanged;
}
}
}