I have been working on a little tool to detect lag.

It simply draws a little square with a number showing how long the last frame took to rend. The square changes color depending on the detected frameskip. Anything over some flashes of yellow is grounds for concern.

Is there anything about this that I can improve? Or even worse, did I make any mistakes?

At least test it with your own content, it might be able to give you valuable insight on where you have rendering issues.
package HTools {
        
        import flash.display.*;
        import flash.events.*;
        import flash.net.*;
        import flash.utils.*;
        import flash.text.*;
        import flash.ui.*;
        
        public class PerformanceMonitor extends Sprite {

                private var logFile:ByteArray;
                
                private var renderTime:uint;
                private var exitTime:uint;
                private var enterTime:uint;
                private var prevEnterTime:uint;
                
                private var saveRef:FileReference;
                
                public var logging:Boolean=false;
                
                public var totalSkippedFrames:uint;
                private var tempFrameSkip:uint;
                public var lastFrameSkip:uint;
                
                public var checkTimeline:MovieClip;
                
                private var label_txt:TextField;
                
                private var realtime:Boolean=true;

                public function PerformanceMonitor() {
                        addEventListener(Event.ADDED_TO_STAGE,init);
                        logFile=new ByteArray();
                        label_txt=new TextField();
                        var format:TextFormat=new TextFormat();
                        format.align="right";
                        label_txt.defaultTextFormat=format;
                        label_txt.selectable=false;
                        label_txt.width=25;
                        label_txt.x=-4;
                        addChild(label_txt);
                        
                        contextMenu=new ContextMenu();
                        
                        var logEntry=new ContextMenuItem("Log");
                        
logEntry.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,doLog);
                        contextMenu.customItems.push(logEntry);
                }
                
                private function init(e:Event):void {
                        addEventListener(Event.EXIT_FRAME,exit);
                        addEventListener(Event.RENDER,render);
                        addEventListener(Event.ENTER_FRAME,enter);
                        
                        addEventListener(MouseEvent.CLICK,toggle);
                        buttonMode=true;
                }
                
                
                private function redraw():void {
                
                        graphics.clear();
                        
                        if(logging) {
                                graphics.lineStyle(1,0xFF0000);
                        } else if(realtime) {
                                graphics.lineStyle(1,0xFF00FF);
                        } else {
                                graphics.lineStyle(1,0x00FFFF);
                        }
                        
                        label_txt.textColor=0x000000;//set each frame so that 
it can be overriden eventually later
                        
                        switch(lastFrameSkip) {
                                case 0:
                                        graphics.beginFill(0x888888);
                                break;
                                
                                case 1:
                                        graphics.beginFill(0xE0E000);
                                break;
                                
                                case 2:
                                        graphics.beginFill(0xFF6600);
                                break;
                                
                                default:
                                        if(lastFrameSkip>=stage.frameRate) {
                                                graphics.beginFill(0x000000);
                                                label_txt.textColor=0xFF0000;
                                        } else 
if(lastFrameSkip>=(stage.frameRate>>1)) {
                                                graphics.beginFill(0x000000);
                                                label_txt.textColor=0xFFFFFF;
                                        } else 
if(lastFrameSkip>=(stage.frameRate>>2)) {
                                                graphics.beginFill(0x7E0000);
                                        } else {
                                                graphics.beginFill(0xFF0000);
                                        }
                                break;
                        }
                        
                        graphics.drawRect(0,0,20,20);
                        
                        if(realtime) {
                                
label_txt.text=(enterTime-renderTime).toString();
                        } else {
                                label_txt.text=totalSkippedFrames.toString();
                                //(checkTimeline?(" 
("+(totalSkippedFrames/checkTimeline.totalFrames*100).toFixed(0)+"%)"
                        }
                
                }
                
                private function toggle(e:MouseEvent):void {
                        realtime=!realtime;
                }
                
                private function exit(e:Event):void {
                        exitTime=getTimer();
                }
                
                private function render(e:Event):void {
                        renderTime=getTimer();
                }
                
                private function enter(e:Event) {
                        
                        prevEnterTime=enterTime;
                        enterTime=getTimer();
                        stage.invalidate();
                        
                        var frameSkipped:Boolean=prevEnterTime>renderTime;
                        
                        if(frameSkipped) {
                                ++tempFrameSkip;
                                ++totalSkippedFrames;
                        } else {
                                lastFrameSkip=tempFrameSkip;
                                tempFrameSkip=0;
                        }
                        
                        if(logging) {
                                if(checkTimeline) {
                                        
logFile.writeUTFBytes(checkTimeline.currentFrame.toString()+",");
                                }
                                
logFile.writeUTFBytes((enterTime-renderTime).toString()+",");
                                
//logFile.writeUTFBytes((enterTime-exitTime).toString()+",");
                                
//logFile.writeUTFBytes((renderTime-exitTime).toString()+
                                logFile.writeUTFBytes("\r\n");
                        }
                        redraw();
                }
                
                private function doLog(e:Event) {
                        if(logging) {                           
                                saveRef=new FileReference();
                                saveRef.save(logFile,"performanceLog.csv");
                                logFile=new ByteArray();
                        }
                        logging=!logging;
                }
        }
        
}
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Reply via email to