| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #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 |
| | |
| | #2 (permalink) |
| Techniker 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) |
| | |
| | #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?
|
| | |
| | #4 (permalink) |
| Techniker 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 |
| | |
| | #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 |
| | |
| | #6 (permalink) |
| Techniker 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) |
| | |
| | #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: |
| | |
| | #8 (permalink) |
| Techniker 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 |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |