package com.meandmybadself.testing { import flash.display.MovieClip; import flash.net.URLRequest; import flash.net.URLVariables; import flash.net.sendToURL; import flash.utils.getTimer; import flash.events.* import flash.system.System; import flash.system.Capabilities; import flash.utils.Timer; /** * ... * @author Jeffery Bennett */ public class PerformanceUtil extends MovieClip { private var $last:uint; private var $ticks:uint; private var $fps:Number; private var $keyCode:uint; private var $minFPS:Number; private var $maxFPS:Number; private static var $log:String = ''; private var $dumpURL:String; private static var $instance:PerformanceUtil; public static var EVENT_INCREASE_QUALITY:String = 'increase'; public static var EVENT_DECREASE_QUALITY:String = 'decrease'; private var $memoryTimer:Timer; public function PerformanceUtil() { if (!$instance) { $instance = this; } } public function reportMemoryUsage(_flag:Boolean = true, _refresh:Number = 1000):void { if (_flag && !$memoryTimer) { $memoryTimer = new Timer(_refresh); $memoryTimer.addEventListener(TimerEvent.TIMER, $memoryReport); $memoryTimer.start(); } else if (_flag && $memoryTimer) { $memoryTimer.delay = _refresh; } else { $memoryTimer.stop(); $memoryTimer.removeEventListener(TimerEvent.TIMER, $memoryReport); $memoryTimer = null; } } private function $memoryReport(te:TimerEvent):void { trace("Memory usage:"+System.totalMemory / 1024000); } public static function log(_str:String):void { $log += _str + "\r"; trace(_str); } public static function getInstance():PerformanceUtil { return $instance; } public function start():void { addEventListener(Event.ENTER_FRAME, $frame); } public override function stop():void { removeEventListener(Event.ENTER_FRAME, $frame); } protected function $frame(e:Event):void { $ticks++; var _now:uint = getTimer(); var _elapsed:uint = _now - $last; if (_elapsed > 1000) { $fps = $ticks / _elapsed * 1000; $ticks = 0; $last = _now; if ($minFPS && $maxFPS) { if ($fps < $minFPS) { dispatchEvent(new Event(EVENT_DECREASE_QUALITY)); } else if ($fps > $maxFPS) { dispatchEvent(new Event(EVENT_INCREASE_QUALITY)); } } } } public function setDumpKeyCode(_arg:Number):void { stage.addEventListener(KeyboardEvent.KEY_DOWN, $key_HANDLER); $keyCode = _arg; } private function $key_HANDLER(ke:KeyboardEvent):void { if (ke.keyCode == $keyCode) { dump(); } } public function setDumpURL(_arg:String):void { $dumpURL = _arg; } /** * Sends client information to server. */ public function dump():void { if (!$dumpURL) { throw(new Error('No dump URL defined.')); return; } //send request, don't worry about the response. var _ur:URLRequest = new URLRequest($dumpURL); var _message:String = ''; _message += "Flash dump for:" + stage.loaderInfo.url + "\r"; _message += "Filesize:" + stage.loaderInfo.bytesTotal + "\r"; _message += "System memory:" + System.totalMemory + "\r"; _message += "Average framerate:" + $fps + "\r"; _message += "Application has been running for:" + (getTimer() * .001) + " seconds.\r"; _message += "Movie width:" + stage.stageWidth + "\r"; _message += "Movie height:" + stage.stageHeight + "\r"; _message += "avHardwareDisable:" + Capabilities.avHardwareDisable + "\r"; _message += "hasAccessibility:" + Capabilities.hasAccessibility + "\r"; _message += "hasAudio:" + Capabilities.hasAudio + "\r"; _message += "hasAudioEncoder:" + Capabilities.hasAudioEncoder + "\r"; _message += "hasEmbeddedVideo:" + Capabilities.hasEmbeddedVideo + "\r"; _message += "hasIME:" + Capabilities.hasIME + "\r"; _message += "hasMP3:" + Capabilities.hasMP3 + "\r"; _message += "hasPrinting:" + Capabilities.hasPrinting + "\r"; _message += "hasScreenBroadcast:" + Capabilities.hasScreenBroadcast + "\r"; _message += "hasScreenPlayback:" + Capabilities.hasScreenPlayback + "\r"; _message += "hasStreamingAudio:" + Capabilities.hasStreamingAudio + "\r"; _message += "hasStreamingVideo:" + Capabilities.hasStreamingVideo + "\r"; _message += "hasTLS:" + Capabilities.hasTLS + "\r"; _message += "hasVideoEncoder:" + Capabilities.hasVideoEncoder + "\r"; _message += "isDebugger:" + Capabilities.isDebugger + "\r"; _message += "language:" + Capabilities.language + "\r"; _message += "localFileReadDisable:" + Capabilities.localFileReadDisable + "\r"; _message += "manufacturer:" + Capabilities.manufacturer + "\r"; _message += "os:" + Capabilities.os + "\r"; _message += "pixelAspectRatio:" + Capabilities.pixelAspectRatio + "\r"; _message += "playerType:" + Capabilities.playerType + "\r"; _message += "screenColor:" + Capabilities.screenColor + "\r"; _message += "screenDPI:" + Capabilities.screenDPI + "\r"; _message += "screenResolutionX:" + Capabilities.screenResolutionX + "\r"; _message += "screenResolutionY:" + Capabilities.screenResolutionY + "\r"; _message += "version:" + Capabilities.version + "\r"; var _uv:URLVariables = new URLVariables(); _uv.message = _message; _uv.log = $log; _ur.data = _uv; sendToURL(_ur); trace('Dump sent.'); } public function destroy():void { removeEventListener(Event.ENTER_FRAME, $frame); removeEventListener(KeyboardEvent.KEY_DOWN, $key_HANDLER); } public function get minFPS():Number { return $minFPS; } public function set minFPS(value:Number):void { $minFPS = value; } public function get maxFPS():Number { return $maxFPS; } public function set maxFPS(value:Number):void { $maxFPS = value; } } }