Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-08-2006, 09:18   #1 (permalink)
Neuer User
 
Registriert seit: Jun 2004
Beiträge: 42
Question setInterval und CPU Auslastung

Hallo zusammen,

ich habe zwar mal gesucht, aber zu dem Thema irgendwie nix finden können und hoffe, dass mir trotzdem einer helfen kann...

Ich habe zwei Movies, die ich für einen Loader nutzen möchte, wobei ein Movie als Anzeigetext verwendet wird und ein zweiter als Animation ablaufen soll. Der Movie wird derzeit im ersten Keyframe gestartet (es gibt auch nur einen Frame) und dort habe ich folgendes Script platziert:

PHP-Code:
iFunctionCalls 0;

iDepthCnt this.getDepth();
iNewDepth iFunctionCalls iDepthCnt;
strMcName "mcLoaderText" String(iNewDepth*(-1));

mc_LoaderText this.attachMovie("mcLoaderText"strMcNameiNewDepth);

mc_LoaderText._x 0;
mc_LoaderText._y 30;
mc_LoaderText._visible true;
mc_LoaderText._alpha 65;
    
function 
newLoaderIcon(mc_Parent){
    
    
iFunctionCalls++;
    
iDepthCnt mc_Parent.getDepth();
    
iNewDepth iFunctionCalls iDepthCnt;
    
strMcName "mcLoaderIcon" String(iNewDepth*(-1));
    
    
mc_LoaderIcon mc_Parent.attachMovie("mcLoaderIcon"strMcNameiNewDepth);
    
    
mc_LoaderIcon._x 18;
    
mc_LoaderIcon._y 10;
    
mc_LoaderIcon._visible true;
    
mc_LoaderIcon._alpha 100;
    
    
trace("neues icon " mc_LoaderIcon._name);
    
    
mc_LoaderIcon.onEnterFrame = function(){
        
        if(
this._alpha >= 5){
            
this._alpha -= 5;
            
this._xscale += 10;
            
this._yscale += 10;
        } else {
            
trace("icon " this._name " ausgefaded.");
            
this._alpha 0;
            
stop();
            
delete this.onEnterFrame;
        }
        
    }
    
    
updateAfterEvent();    
}

setInterval(newLoaderIcon200this);
stop(); 
Soweit so gut. Das Script an sich funktioniert wunderbar. Wenn ich mir allerdings mal den Systemmonitor anschaue, scheint sich der Flashplayer so nach ca. 200 Aufrufen zu verschlucken, wodurch erstens die Animation aus dem Tritt kommt und zweitens die CPU Auslastung sich immer weiter zu zieht, sprich nach entsprechend langer Laufzeit irgendwann bei 100% angekommen ist. Eigentlich finde ich die Steuerung über setInterval immer absolut unsauber, weil die Steuerung dem Player überlassen wird und man nix mehr kontrollieren kann.

Nun meine Frage: Habe ich irgendwo einen Fehler oder der Player? Hat vielleicht jemand einen Verbesserungsvorschlag? Aber bitte kein Tween. Das habe ich auch schon ausprobiert und ist von der Performance absolut indiskutabel...

Wäre super, wenn jemand einen Tipp hat! Danke schonmal...

Geändert von Oli K. (13-08-2006 um 09:20 Uhr)
Oli K. ist offline   Mit Zitat antworten
Alt 13-08-2006, 11:31   #2 (permalink)
_rotation++;
 
Benutzerbild von jbloom
 
Registriert seit: Apr 2004
Beiträge: 109
Alle 200 Millisekunden ein onEnterFrame zu definieren kommt mir sehr spanisch vor...
__________________
Signatur...?
jbloom ist offline   Mit Zitat antworten
Alt 13-08-2006, 11:33   #3 (permalink)
meistens harmlos
 
Benutzerbild von rena
 
Registriert seit: Jun 2001
Ort: Stuttgart
Beiträge: 17.643
Löschst du die Intervalle auch wieder? Falls nicht, laufen die alle weiter, rufen die Funktion immer wieder auf und addieren sich so langsam hoch.

Beispiel
Code:
function funktionsname(){
   //was alles passieren soll aber dann
   clearInterval(myInterval);
}
myinterval=setInterval(funktionsname, 200);
Gruß
Rena
__________________
www.rena-hermann.de

The angels have the phone box
rena ist offline   Mit Zitat antworten
Alt 13-08-2006, 11:39   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
alle 200 millisekunden lädst du etwas neuen und wunderst dich, das irgendwann mal schicht ist?

irgendwann ist jeder parkplatz voll, jedes station überlaufen und jedes buffet leergefuttert.

hörst du auch irgendwann einmal auf ständig neu dazu zu laden? oder wirfst du wenigstens irgend wann einmal nicht mehr benutzte mc_LoaderIcon's raus?


------------
bei besserer absprache hätten wir im chor antworten können ;-)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (13-08-2006 um 12:21 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 13-08-2006, 11:57   #5 (permalink)
Neuer User
 
Registriert seit: Jun 2004
Beiträge: 42
Danke für Eure Hinweise. Damit kommt ja schonmal etwas Licht in die ganze Situation...

Also alle 200ms wird ein neuer Movie mit einem onEnterFrame erstellt. Das ist zwar ziemlich kurz, sollte aber kein Problem darstellen, weil eigenlich nie mehr als vier Movies auf einmal ablaufen...

Was ich mir durchaus vorstellen kann ist, dass es tatsächlich ein Problem mit den nicht gelöschten Interval IDs ist. Allerdings stoppt das gesamte Script, wenn ich ein clearInterval nach dem delete this.onEnterFrame platziere...

Daher nochmal die Frage, wie löse ich das Problem am Besten? Dass es kein Problem gibt, habe ich ja nicht behauptet, gell, @hgseib. Ich habe nur nach einem Tipp für einen Lösungsansatz gefragt...
Oli K. ist offline   Mit Zitat antworten
Alt 13-08-2006, 12:07   #6 (permalink)
meistens harmlos
 
Benutzerbild von rena
 
Registriert seit: Jun 2001
Ort: Stuttgart
Beiträge: 17.643
Und wenn du das Interval ganz am Ende der Funktion "clearst"?
Ansonsten wäre ein Demo mit der nun aktuellen Version (-> mit clearInterval(interval-ID)) hilfreich, um mal reinzuschauen.
__________________
www.rena-hermann.de

The angels have the phone box
rena ist offline   Mit Zitat antworten
Alt 13-08-2006, 12:13   #7 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
"..Habe ich irgendwo einen Fehler oder der Player?.."
wollen wir mal nicht die goldwaage auspacken. du wunderst dich schon über das ergebnis.

wenn ich es richtig verstanden habe,
dann legst du ein mc über das andere. irgendwann liegen 100 oder mehr mc's übereinander. das belastet den rechner schon. also jedesmal das mc. das 3..4 ebenen tiefer liegt komplett rauskegeln.

setInterval gibt dir eine nummer zurück, mit der musst du das interval clearen. dabei darauf achten, das jedes setInterval eine neue nummer erzeugt.

eine möglichkeit, das zu händeln ist:
http://www.seibsprogrammladen.de/fra...thmen/Interval
mehrere Interval's
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (13-08-2006 um 12:21 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 13-08-2006, 12:40   #8 (permalink)
Neuer User
 
Registriert seit: Jun 2004
Beiträge: 42
Zitat:
Zitat von hgseib
"..Habe ich irgendwo einen Fehler oder der Player?.."
wollen wir mal nicht die goldwaage auspacken.
Hatte ich auch nicht vor... Ok, ich habe mal eine Demo angehangen.
@hgseib: Danke für den Link!
Angehängte Dateien
Dateityp: zip demo.zip (3,2 KB, 6x aufgerufen)

Geändert von Oli K. (13-08-2006 um 12:42 Uhr)
Oli K. ist offline   Mit Zitat antworten
Alt 13-08-2006, 14:15   #9 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
ist doch ein unterschied, ob man sich nur den script ansieht oder mal mit einer fla was ausprobieren kann.

a) das ganze zeugs hättest du auch locker mit einem einfachen tween machen können der loopt.

b) da ich nicht weiss, was das ganze noch werden soll mal eine totalüberarbeitung:
p.s.
60 fps ist ziemlich heftig! der mensch sieht sowieso nicht mehr als 25 bilder pro sekunde.
somit macht auch dein setInterval keinen sinn. so schnell kann keiner den bildschirm updaten, wie du ihn gezeichnet haben willst. setInterval macht sinn:
- unterschiedliche zeitabläufe gegenüber dem fps
- reine berechnungen können öfters oder seltener ausgeführt werden
- bildschirmdarstellungen nur wenn seltener als fps (es seih denn, fps ist wesentlich kleiner als 25)
Code:
function newLoaderIcon(me) {
	me._depth++;
	if (me._depth>500) {
		clearInterval(iTemp);
		trace("fertig");
	}
	var _mc = me.attachMovie("mcLoaderIcon", "icon"+me._depth, me._depth);
	_mc.onEnterFrame = function() {
		if (this._alpha>=5) {
			this._alpha -= 5;
			this._yscale = this._xscale += 10;
			this._x += this._width/3; // nur so zum ansehen
		} else {
			this.removeMovieClip();
		}
	};
}
this.depth = 0;
iTemp = setInterval(newLoaderIcon, 120, this);
stop();
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (13-08-2006 um 14:22 Uhr)
hgseib 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 06:44 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele