Flashhilfe.de - Flash Community

Tutorial : FPS Counter in AS3 [Flash 9]

 


AntwortenRegistrieren Seite1  

niquito12#1
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

30.07.2008, 16:03

Grüsse Gemeinde!
Dies hier ist eine kleine Anleitung für die Erstellung eines AS3 Frame Counters. Fragen , Wünsche , Beschwerden bitte an mich. Ich werde das vielleicht auch noch als kleine GUI Komponente abliefern, wenns irgendwer wünscht.

Nachdem ich nichts im Internet gefunden habe , habe ich mir selbst einen FPS - Counter zusammengebaut. Ich will hier ein kleines ( mein erstes ) Tutorial anbieten. Es ist ein sehr einfacher Counter der keine Garbagecollection oder weitergehendes berücksichtigt, aber er funktioniert zuverlässig für das Debuggen und Testen der Performance von Flashfilmen.

1. Dazu registrieren wir einen Listener , der jedes Frame eine Funktion aufruft. Vorher importieren wir noch die Eventklasse mittels eines Imports. Das machen wir im Konstruktor ( Das ist die Funktion die so heisst wie die Klasse selbst )

Import
ActionScript:
1
2
3
package {
import flash.events.Event;
....


Registrieren des Listeners
ActionScript:
1
2
3
public function Klassenname {
addEventListener ( Event.ENTER_FRAME, onEnterFrame );
...


Jetzt führt er jedes Frame im Film die funktion onEnterFrame aus.

2. Wir brauchen nun eine Variable die er jedes Frame hochzählt. Dazu erstellen wir eine Klassenvariable .
ActionScript:
1
2
3
4
5
6
public class GUI extends Sprite
   {
      
      private var fps:int;
.....


...und initialisieren sie im Konstruktor .
ActionScript:
1fps=0;


Jetzt lassen wir sie jedes Frame hochzählen. Das machen wir natürlich in onEnterFrame.
ActionScript:
1
2
3
4
private function onEnterFrame ( event: Event ):void
      {
         fps++;         
      


Nun zählt es jedes Frame immer weiter. Jetzt wollen wir aber nach jeder Sekunde wissen wie oft er ein Frame gerendert ( also wie oft er onEnterFrame ) aufgerufen hat.

Hier kommt die Methode setInterval (Methode,Zeit in ms); ins Spiel mit den Bildern.

Sie führt "Methode" alle "Zeit in ms" aus.

Im Konstruktor fügen wir nun diese Zeile ein. Sie führt viewFPS alle 1000ms = 1 Sekunde aus.
ActionScript:
1setInterval (viewFPS,1000);


Fehlt uns nur noch die Funktion viewFPS. Sie gibt auf der Konsole die nach einer Sekunde gezählten Frames aus und setzt die Variable wieder auf 0 , damit er wieder von neuem zählt.

ActionScript:
1
2
3
4
5
private function viewFPS ()
      {
         trace(fps);
         fps = 0;
      }


Wenn ihr euren Film Testet / Debugt , bekommt ihr auf der Konsole dann jede Sekunde einen Wert , der die wirklichen FPS des Filmes wiedergibt.

In Windows und CS3 wäre das die Tastenkombo Alt+Enter fürs Testen und Alt+Shift+Enter.
In OSX / Mac wäre es irgendwas mit Apfel , Birne oder Blumenstrauß
Qt! www.adrianslaboratory.net
Geändert von niquito12 am 30.07.08 um 16:28 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


niquito12#2
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

01.08.2008, 09:47

Ich habe hier ein paar Fehler entdeckt. Außerdem habe ich noch im Anhang eine Komponente hinzugefügt die ihr nutzen könnt.

Fehler oben waren zum einen:
Es fehlten die Importe    
import flash.display.MovieClip;
import flash.display.Sprite;      
import flash.utils.setInterval;

Der Finale Code lautet so:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package
{
   import flash.display.MovieClip;
   import flash.display.Sprite;   
   import flash.events.Event;
   import flash.utils.setInterval;
   /**
    * @class FPSMeter
    * @interface none
    * @author ABertl
    * @version 0.2b
    * @description Viewer for real FPS on console
    */

   public class FPSMeter extends Sprite
   {

      var j:int;

      public function FPSMeter ()
      {
         addEventListener ( Event.ENTER_FRAME, onEnterFrame );
         j=0;
         
         setInterval (viewFPS,1000);
      }
      private function onEnterFrame ( event: Event ):void
      {
         j++;
      }
      private function viewFPS ()
      {
         trace(j);
         j = 0;
      }

   }
}
Qt! www.adrianslaboratory.net

Angehängte Dateien:
Komprimierte Datei fpsanzeige.zip1.21 KB
springer#3
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

01.08.2008, 11:16

ich würde noch die memory anzeige einbauen, mit
ActionScript:
1System.totalMemory

die kann unter umständen auch ganz hilfreich sein...

die abspielgeschwindigekt im browser ist bei mir oftmals etwa 2-3 frames langsamer als beim offline - testing....
warum weiss ich nicht, offline ist es meistens ziemlich stabil und verändert sich kaum, im gegensatz zum browser...
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
badskill#4
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

01.08.2008, 11:17

Hi,
setInterval ist aber nicht so genau, wie es den Anschein hat:
ActionScript:
1
2
3
4
5
6
7
8
9
10
var t:Number = getTimer();

var interval:Number = setInterval( check, 1000 );

function check() : void
{
   trace( getTimer() - t );
   
   t = getTimer();
}

Je nach eingestellter Framerate werden da ganz schnell mehrere Frames verschluckt.
Werbung
Beiträge: 0
Registriert: Feb 2016


niquito12#5
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

01.08.2008, 11:24

So und gleich noch ein Update. Ich habe 2 Komponenten erstellt. Im Anhang findet ihr eine Zip Datei. Darin sind 2 Dateien

FPSMeter.swc
Das ist die Konsolenversion des FPSMeters. Es gibt beim Debuggen auf der Konsole unten sekündlich die FPS aus.

FPSMeterGUI.swc
Das ist die GUIVersion , die das ganze im Bild ausgibt.

Installation der Komponenten für Windows:
Kopiert FPSMeter.swc oder FPSMeterGUI.swc ins Verzeichnis C:\Programme\Adobe\Adobe Flash CS3\de\Configuration\Components
Das Verzeichnis für Mac heißt
/Applications/Adobe Flash CS3/Configuration/Components

Nun solltet ihr die Komponenten in der Liste haben. Doppelklick befördert sie auf die Bühne. Ich persönlich starte sie am liebsten in Actionscript. Daher lösche ich sie von der Bühne wieder. In der Bibliothek sind die 2 Komponenten weiter vorhanden.

1. Importieren der Komponente

ActionScript:
1
2
3
import FPSMeter
// oder
import FPSMeterGUI


2. Definition als Variable

ActionScript:
1
2
3
var fpsmeter:FPSMeter;
//oder
var fpsmeter:FPSMeterGUI;


3. Initialisierung durch den New Operator ( Vorzugsweise im Konstruktor )
ActionScript:
1
2
3
fpsmeter = new FPSMeter();
oder
fpsmeter = new FPSMeterGUI()


4. Hinzufügen auf die Bühne ( Nur bei der GUI Version erforderlich )
ActionScript:
1addChild(fpsmeter);


Es besteht natürlich, da die Komponenten Sprite erweitern , die Möglichkeit x , y und sonstige Movieclip- Spezifische Werte zu verändern um die Anzeige zu positionieren.
Qt! www.adrianslaboratory.net

Angehängte Dateien:
Komprimierte Datei fpsmeter.zip2.60 KB
Geändert von niquito12 am 01.08.08 um 11:32 Uhr
niquito12#6
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

01.08.2008, 11:30

@ Springer
Danke , ich werde die nächsten Tage mal eine 2. Version herausbringen. Dann werde ich auch auf die Garbagecollection eingehen um die Anzeige ein und ausschalten zu können. Außerdem werde ich mir mal System.totalMemory anschaun und einbaun.

@badskill
Ich werde das demnächst auch prüfen. Ich habe daran nicht gedacht , da ich für meine Anwendung nicht im Browser arbeite sondern mit dem Projector und auch nicht wirklich online ;-)
Qt! www.adrianslaboratory.net
springer#7
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

01.08.2008, 11:30

das MAC verzeichnis:

/Applications/Adobe Flash CS3/Configuration/Components
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
niquito12#8
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

01.08.2008, 11:36

Und schon ists drin!
Es ging mir in erster Linie nur um eine grobe FPS Einschätzung. Ich beschäftige mich in Flash erst seit 1,5 Monaten , aber ich werd mir das mal genau anschaun, damit ich eine hübsche Open source Komponente hinbekomm, sozusagen als Ausgleich für meine vielen Fragen ;)
Qt! www.adrianslaboratory.net
springer#9
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

01.08.2008, 18:01

hab das mit dem interval noch ausprobiert, und stimmt er ist wirklich ziemlich ungenau, teilweise sogar ziemlich übel... hmm..
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
niquito12#10
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

04.08.2008, 10:00

Ich hab es ebenfalls getestet. Bei mir ist der Timer maximal 16 ms darüber, was heisst , dass in der Anzeige höchstens 1 Frame zu viel angezeigt wird.
War es bei dir mehr , springer?
Qt! www.adrianslaboratory.net
niquito12#11
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

06.08.2008, 12:02

Auf Anfrage von Springer habe ich jetzt noch System.totalMemory hinzugefügt. Im Anhang sind nun die kompletten Quelldateien der Versionen
- Console
- Mit GUI
- Mit TotalMemory
- Mit GUI und TotalMemory
- Mit Timer ( siehe Einwand von badskill )


Ich hoffe es sind keine Fragen offen geblieben und ich habe einigen Entwicklern damit geholfen :)
Qt! www.adrianslaboratory.net

Angehängte Dateien:
Komprimierte Datei fpsmeter.zip39.42 KB
springer#12
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

06.08.2008, 12:15

bei mir waren es wesentlich mehr als nur 16 ms...

manchmal war es ziemlich genau, und hat sich nach einer gewissen zeit eingependelt... aber es hat sich jedes mal anders verhalten...
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Geändert von springer am 06.08.08 um 12:16 Uhr
badskill#13
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

06.08.2008, 12:23

Hi,
hier mal eine kleine Inspiration für eine mögliche Version 0.4b :)
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package
{
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.utils.getTimer;
   
   public class FPS extends Sprite
   {
      private var _fps : Number;
      private var _lastFrameTime : Number;
      private var _currentFrameTime : Number;
      
      public function FPS()
      {
         init();
      }
      
      private function init() : void
      {
         addEventListener( Event.ENTER_FRAME, onEnterFrame );
      }
      
      private function onEnterFrame( e:Event ) : void
      {
         _currentFrameTime = getTimer();
         _fps = 1000 / ( _currentFrameTime - _lastFrameTime );
         _lastFrameTime = _currentFrameTime;
         
         trace( _fps );
      }
   }
}
niquito12#14
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

08.08.2008, 10:18

Version 0.4b

Changelog:

- Verbesserter Algorhytmus gesponsert von badskill
- Auswertung des Meridans von jeweils 10 Werten - Ausreisser nicht so stark berücksichtigt
- Ausgabe des Framewertes alle 10 Frames

Vorrausschau auf 0.5b
- Min/Max
- Parameterisierte Konfiguration der Komponente

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package
{
   import flash.utils.getTimer;
   import flash.display.Sprite;
   import flash.text.TextField;
   import flash.events.Event;
   import flash.system.System;
   

   /**
    * @class FPSMeter
    * @interface none
    * @author ABertl
    * @version 0.4b
    * @description Console Version with badskills logic for exact frame calculation each frame
    * for the FPSMeter - shows real FPS - thanks for the idea to badskill @ flashhilfe.de/forum
    * sorting array of specified Interval and taking meridan
    */

   public class FPSAndMemoryMeterGUI extends Sprite
   {
      public var fpsOutput:TextField;
      private var _fps : Number;
      private var _lastFrameTime : Number;
      private var _currentFrameTime : Number;
      private var counter:int;
      private var fpsArray:Array;
      private var interpolateInterval:int;

      public function FPSAndMemoryMeterGUI ()
      {
         fpsArray = new Array();
         fpsOutput= new TextField();
         fpsOutput.border=true;
         fpsOutput.borderColor=0xFFFFFF;
         fpsOutput.background=true;
         fpsOutput.backgroundColor=0x009933;
         fpsOutput.textColor=0xFFFFFF;
         fpsOutput.height=40;
         fpsOutput.width=130;
         
         interpolateInterval = 10;

         counter=0;

         addChild (fpsOutput);
         addEventListener ( Event.ENTER_FRAME, onEnterFrame );
      }
      private function onEnterFrame ( event: Event ):void
      {         
         _currentFrameTime = getTimer();
         _fps = 1000 / ( _currentFrameTime - _lastFrameTime );
         counter = fpsArray.push(_fps);         
         
         if (counter==interpolateInterval)
         {                        
            fpsArray.sort();            
            _fps= (fpsArray[Math.floor(interpolateInterval/2)] + fpsArray[Math.floor(interpolateInterval/2)-1])/2;
            viewFPS (_fps);
            fpsArray.length = 0;
         }
         _lastFrameTime = _currentFrameTime;
      }
      private function viewFPS (fps:Number)
      {
         fpsOutput.text="FPS: "+_fps.toString(10)+"\nTotalMemory: "+System.totalMemory;
      }

   }
}
Qt! www.adrianslaboratory.net

Angehängte Dateien:
Komprimierte Datei fpsmeter0.4b.zip9.47 KB
Geändert von niquito12 am 08.08.08 um 10:19 Uhr

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de