16 ноября 2011

Считаем ресурсы

В процессе разработки возникает необходимость тестировать приложение и его отлаживать. В частности на производительность и на утечку памяти. Для этих целей флешеры часто считают  так называемый fps и memory.

Решил написать небольшой класс который выводит данные два параметра, после того как нажать " ` ", выводит fps с точностью до первого знака после запятой, и количество памяти в kb.

Класс будет называться FPSCounter.as:

package
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.utils.getTimer;
import flash.system.System;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class FPSCounter extends Sprite
{
  private var last:uint = getTimer();
  private var ticks:uint = 0;
  private var tf:TextField;
  public function FPSCounter(stage:Stage) 
  {
    tf = new TextField();
    tf.textColor = 0x000000;
    tf.text = "----- fps --------- memory";
    tf.selectable = false;
    tf.autoSize = 'left';
    tf.textColor = 0xeeeeee;
    tf.background = true;
    tf.backgroundColor = 0x333333;
    //ставим прослушиватель на нажатия кнопок клавиатуры
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
  }
  private function keyPressedDown(event:KeyboardEvent):void 
  {
    var key:uint = event.keyCode;
    if (key == Keyboard.BACKQUOTE)
      {
        // если еще не нажимали и текст не находится в области видимости
        if (!tf.parent)
         {
            stage.addEventListener(Event.ENTER_FRAME, tick);
            stage.addChild(tf);
         }
        else 
         {
            stage.removeEventListener(Event.ENTER_FRAME, tick);
            stage.removeChild(tf);
         }
      }
  }
    
  public function tick(evt:Event):void 
  {
    //считаем fps и memory  
    ticks++;
    var now:uint = getTimer();
    var delta:uint = now - last;
    if (delta >= 1000) 
      {
        var fps:Number = ticks / delta * 1000;
        tf.text = fps.toFixed(1) + " fps " +
                  int(System.totalMemory/1024) + 'kb'+ " memory";
        ticks = 0;
        last = now;
      }
  }
}
}

А теперь осталось только создать экземпляр класса в Main.as:

package
{
import flash.display.Sprite;
import flash.display.Stage;
import FPSCounter;
public class Main extends Sprite
{
  public function Main() 
  {
    var fps:FPSCounter = new FPSCounter(stage);
    addChild(fps)
  }
}
}

Теперь по нажатию на клавишу на клавиатуре, мы можем получить доступ к этим важным для нас данным.
Приятного тестирования и работы)

1 комментарий:

Поделиться своими мыслями...