Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 01-06-2006, 18:01   #1 (permalink)
¿
 
Registriert seit: Sep 2005
Beiträge: 86
Performance von setInterval()

Hallo zusammen!

Ich animiere in einem Projekt diverse MCs per setInterval(). Die MCs beinhalten eine Grafik ~20kb, und mehrere Zeilen dynamisch generierte Textfelder. Als Parameter beim Aufruf habe ich 40 eingestellt, was theoretisch einer Bildrate von 25 fps entsprechen müsste (40ms passen 25 mal in eine Sekunde -> 25 fps).

Nun habe ich folgendes festgestellt:
Wenn ich die Bildrate des Projekts auf 25 fps setze (ganz normal in den Einstellungen) und KEIN updateAfterEvent() nutze, wiederholen sich die per setInterval() aufgerufenen Funktionen ca. alle 40 ms (abgelesen mit getTimer). Nutze ich allerdings updateAfterEvent(), dann werden die Funktionen etwa alle 80 ms aufgerufen. Setze ich als Parameter 20 ein, so werden die Funktionen etwa alle 40 ms aufgerufen.

Dazu zwei Fragen:
- Stimmt die Beschreibung in der Hilfe, dass die Funktion im Abstand der angegebenen Zeit in ms aufgerufen wird, nicht?
- Ist es Zufall, dass es auf meinem System um den Faktor 2 abweicht und es sieht auf einem schnelleren/langsameren anders aus?

Vielen Dank für die Antworten
o-nyx ist offline   Mit Zitat antworten
Alt 02-06-2006, 00:32   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
setInterval arbeitet korrekt, aber es löst keinen interrupt aus! wenn die setInterval-zeit abgelaufen ist, dann wird die zugehörige funktion in die liste der auszuführenden funktionen eingereiht. und die kommt dann halt drann, wenn sie drannkommt.
wenn du z.b. eine endlosschleife zu gange hasst, dann kanns etwas dauern ;-)

offensichtlich verursachst du mit deinem updateAfterEvent unnötige neuzeichnungen, wärend denen natürlich kein anderer drann darf.


"..und es sieht auf einem schnelleren/langsameren anders aus?.."
das kann gut sein. browser geben dem swf recht wenig rechenzeit. da gehts schon mal um die hälfte langsammer als wie das swf im projektor.
deshalb im browser testen und die frame-rate so einstellen, das auch langsamere rechner das schaffen können.
und bei z.b. zwei swf's auf einer html-seite, da kann die power schonmal total zusammen brechen.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (02-06-2006 um 00:34 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 02-06-2006, 06:13   #3 (permalink)
¿
 
Registriert seit: Sep 2005
Beiträge: 86
Was mich wundert ist nur, dass sich die Bildrate verdoppelt, wenn ich den Zeitparameter von 40ms auf 20ms halbiere. Wenn die Funktionen mehr Zeit als 40ms brauchen dürften sie doch bei 20ms nicht plötzlich doppelt so schnell sien, oder?
o-nyx ist offline   Mit Zitat antworten
Alt 02-06-2006, 18:59   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
die wege des herrn und die von flash sind unergründbar ;-)

lade mal eine demo hoch, zum ansehen.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 03-06-2006, 13:48   #5 (permalink)
¿
 
Registriert seit: Sep 2005
Beiträge: 86
Hier ist das Projekt. Ich habe die eingebetteten Schriften weggelassen, damit es etwas schneller läd, also nicht wundern wenn der Text etwas dürftig aussieht. Ansonsten ist alles drin, da der ganze Umfang des Projekts ja vermutlich die Ursache ist.

Den Zeitparameter von setInterval() kannst du entweder über die XML-Datei ändern, oder du ersetzt den Ladebefehl in Zeile 32. Momentan ist 25 eingestellt. Der Aufruf (Zeile 181 und Folgende) erfolgt dann so: 1000/fps.

updateAfterEvent() steht in Zeile 222 und 248, momentan sind beide Zeilen auskommentiert.

http://www.o-nyx.de/files/beispiel.zip
o-nyx ist offline   Mit Zitat antworten
Alt 04-06-2006, 00:16   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
updateAfterEvent ist gedacht für z.b. onMouseMove usw., wenn eine ausserplanmässige bewegung stattfindet. und selbst da macht es bestenfalls sinn, wenn der film sehr langsam -auf z.b. 8 fps- eingestellt ist.
richtige filme laufen auch nur mit 25 bps, weil der mensch schneller garnicht erfassen kann. stubenfliegen schaffen 200 fps (glaube ich) - dafür taugt deren langzeitgedächtnis nichts. hat halt alles vor und nachteile ;-)
höhere frameraten machen nur sinn, wenn etwas öfters berechnet werden soll.

flash updatet bei dir mit 25 fps, und im selben interval kommt jedesmal der befehl: updateAfterEvent. damit hat flash die doppelte arbeit.
das dürfte die verdoppelung der zeit sein (?) und macht absolut keinen sinn!

warum lässt du das nicht einfach in einem onEnterFrame rausfahren ???
die bewegegeschwindigkeit besser mit einem zu addierenden wert steuern (wenn das überhaupt notwendig ist?)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (04-06-2006 um 03:00 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 04-06-2006, 10:01   #7 (permalink)
¿
 
Registriert seit: Sep 2005
Beiträge: 86
Ok, das ist einleuchtend. Meine Intention war, von der in Flash eingegebenen Framerate völlig unabhängig zu sein und sie völlig über die XML-Datei steuern zu können.

Zu onEnterFrame: Wenn ich alle Bewegungen da rein packe, müsste ich drumrum immer eine if-Abfrage mit einer Startvariable machen.
PHP-Code:
_root.onEnterFrame = function() {
   if( 
playAnimation1 ){
      ...
   } else if( 
playAnimation2 ) {
      ...
   }
   ...

Da das ganze dann jedes Frame abgefragt wird schien mir das aus Sicht der Performance ungünstiger, als mehrere einzelne Schleifen, die ich starten und terminieren kann.
o-nyx ist offline   Mit Zitat antworten
Alt 04-06-2006, 15:16   #8 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
aber nein ...
event-funktionen werden den objekten angehängt und nach gebrauch wieder gelöscht.
Code:
_btn.onRelease = function() {
	// ...
	_mc.speed = 2;
	_mc.posX = 100;
	_mc.onEnterFrame = function() {
		this._x += this.speed;
		if (Math.abs(this._x-this.posX)< this.speed) {
			this._x = _mc.posX;
			delete this.onEnterFrame;
		}
	};
};
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 06-06-2006, 12:18   #9 (permalink)
¿
 
Registriert seit: Sep 2005
Beiträge: 86
Ah, wieder was gelernt, danke dir

Aber macht es denn einen Unterschied, ob ich eine Eventfunktion erstelle und anschließend terminiere oder einen Timer? Also aus Sicht der Performance?
o-nyx ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele