Zurück   Flashforum > Flash > Flash Fortgeschritten > Flash CS3 Professional

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 15-10-2010, 16:35   #1 (permalink)
Neuer User
 
Registriert seit: Sep 2010
Beiträge: 9
Speicherverhalten bei .attachMovie/.removeMovieClip()

Hallo,
kann mir jemand sagen was bei Flash intern passiert, wenn man
bei onEnterFrame neue Movies ranhängt und diese entfernt?

also z.B. folgender code
AS2

Code:
_root.onEnterFrame = function(){
	++i
	var cilj:MovieClip = _root.attachMovie("jet","jet"+i,i)
	 ...
    cilj.onEnterFrame = function(){
	 ...
     if(cilj._currentframe == 15){ 
	  cilj.removeMovieClip()
     }
    }
die "var cilj.." werd ich noch aus der Endlosschleife rauscoden,
aber was passiert mit dem Rest?

Kann man sowas bedenkenlos bei einem Spiel einsetzen, welches über mehrere Stunden läuft?
Wird der Speicher wieder sauber freigeschaufelt?
Gibt es (wie bei java)einen Garbage Collector, der irgendwann anspringt Performance runter geht?
Havoc ist offline   Mit Zitat antworten
Alt 15-10-2010, 16:46   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.325
probiere es doch einfach aus.

grundsätzlich funktioniert das. es werden mc's erzeugt, diese leben 15 frames lang und dann sterben sie wieder.

gefühlsmässig würde ich die nicht ständig neu erzeugen. es langt, wenn man den objekten neue parameter gibt.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 15-10-2010, 16:46   #3 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.163
Zwei ineinander verschachtelte onEnterFrame sind nicht so doll, aber wenn Du in jedem Frame einen neuen MC mit onEnterFrame erzeugen musst, grundsätzlich korrekt.

Auf die Garbage Collection hast Du insbesondere in AS2 wenig Einfluss. Was ich nochmachen würde, wäre das onEnterFrame zu löschen, bevor Du den MC löschst:
PHP-Code:
delete cilj.onEnterFrame;
cilj.removeMovieClip() 
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist gerade online   Mit Zitat antworten
Alt 15-10-2010, 16:53   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.325
Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Zwei ineinander verschachtelte onEnterFrame sind ..
.. nicht vorhanden ;-)
schau dir den script nochmal genau an.

und
Zitat:
Zitat von Martin Kraft Beitrag anzeigen
wäre das onEnterFrame zu löschen
ist bei AS2 nicht nötig. mit dem mc stirbt auch sein onEnterFrame (im gegensatz zu AS3).
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (15-10-2010 um 16:54 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 15-10-2010, 17:10   #5 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.163
Zitat:
Zitat von hgseib Beitrag anzeigen
schau dir den script nochmal genau an.
Hab ich, und da steht ein onEnterFrame in einem anderen:
PHP-Code:
_root.onEnterFrame = function(){
    
// ...
    
cilj.onEnterFrame = function(){
        
//...
    
}

Was oft ein klassischer Anfängerfehler, aber - wie gesagt - in diesem Fall ja gewünscht ist. Besser wäre es jedoch alle MCs in ein Array zu stecken und über ein onEnterFrame zu kontrollieren. Nebenbei hat man so auch ein kontrolle darüber wieviele MovieClips grade aktiv sind und könnte so regulierend einfreifen.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (15-10-2010 um 17:11 Uhr)
Martin Kraft ist gerade online   Mit Zitat antworten
Alt 15-10-2010, 17:41   #6 (permalink)
Neuer User
 
Registriert seit: Sep 2010
Beiträge: 9
Jaja ist nicht mein Fehler, sondern Code aus nem Beispiel
(und es is tatsächlich ein onEnterFrame in einem onEnterFrame)

Ein mc array, bei dem ich abwechselnd mein mc zuordne wäre wohl die beste Option.
Falls ich es aber nicht mache/machen kann, wie sauber wird mit .removeMovieClip() entfernt? bzw. mit anderen .remove oder =null; ?

Zitat:
probiere es doch einfach aus.
bringt leider nix, ein mal so etwas merkt man nicht,
aber wenn ich viele Effekte haben will, die sowas machen, könnte evtl. etwas böses passieren
Havoc ist offline   Mit Zitat antworten
Alt 15-10-2010, 17:45   #7 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.163
Zitat:
Zitat von Havoc Beitrag anzeigen
bringt leider nix, ein mal so etwas merkt man nicht,
aber wenn ich viele Effekte haben will, die sowas machen, könnte evtl. etwas böses passieren
Ich denke schon, dass man das testen kann. Notier Dir einfach den Speicherverbrauch des Flashplayers im Taskmanager. Lass die SWF ein paar Stunden laufen und schau Dir an, ob der Verbrauch steigt.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist gerade online   Mit Zitat antworten
Alt 18-10-2010, 09:06   #8 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.325
Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Hab ich, und da steht ein onEnterFrame in einem anderen:
PHP-Code:
_root.onEnterFrame = function(){
    
// ...
    
cilj.onEnterFrame = function(){
        
//...
    
}

das erste onEnterFrame ist für die hauptzeitleiste und erzeugt jedesmal ein neues objekt.
das zweite onEnterFrame ist NICHT verschachtelt, sondern es ist ein onEnterFrame für die zeitleiste des eben neu erstellten objektes. dessen zeitleiste läuft, bis es frame 15 erreicht und wird danach zerstöhrt. es ist keineswegs gesagt bzw. hier ersichtlich, das dies auf direktem wege passiert. womit man das abzählen bis 15 NICHT für alle in einem globalen array ausführen sollte. bringt hier auch überhaupt keinen vorteil. in hinblick auf OOP sollte jedes objekt möglichst autark sein.
es ist auch kein script, der direkt ausgeführt wird, sondern es ist die zuweisung einer namenlosen funktion in das onEnterFrame von cilj.
und zu guter letzt, verschachtelte onEnterFrame's sind überhaupt nicht möglich! jedes weitere onEnterFrame auf das selbe objekt überschreibt den vorherigen eintrag.
Havoc lass dir da nicht einreden, zumindestens dieser teil deines programmes ist korrekt (bzw. der/die-jenige beispielersteller hat sich durchaus was dabei gedacht).

nochmals zu deiner eigentlichen frage:
nach dem löschen gibts ein loch im RAM das nicht direkt und vollständig durch andere objekte gefüllt werden kann. deshalb hin und wieder das aufräumen.
das sollte/könnte weniger sein, wenn die objekte nicht gelöscht, sondern wieder verwendet werden. das ist aber sehr hypothetisch gedacht und ich vermute, es ist kaum nachweissbar obs wirklich etwas bringt.
lass dein programm mal über nacht laufen, wenns am nächsten morgen noch lebt und nicht mehr speicher benötigt (z.b. im tastmanager ansehen) dann sollte das auch noch länger laufen.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 18-10-2010, 09:36   #9 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.163
@hgseib:

Ich habe durchaus gesehen, dass die onEnterFrames zu verschieden Objekten gehören und sich deshalb nicht überschreiben. Was wohl das ist, was Du unter "verschachtelt" verstehst. Generel bedeutet "verschachtelt" aber nichts anderes, als dass sich etwas in etwas anderem befindet - also z.B. eine Funktion in einer anderen deklariert wird.

Mal abgesehen davon, dass das vorliegende AS1-Script mit OOP nicht viel zutun hat, finde ich es auch in dieser Hinsicht sinnvoll, dass ein übergeordnetes Objekt seine Unterobjekte über ein Array verwaltet und diese sich nicht einfach eigenmächtig hinzufügen oder löschen können. Nur so hat man ausreichende Kontrolle über ihre Anzahl!

Was den Performancetest angeht, scheinen wir uns ja einig zu sein!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (18-10-2010 um 10:24 Uhr)
Martin Kraft ist gerade online   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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Flash CS3] attachMovie removeMovieClip czc Flash Einsteiger 14 23-01-2009 16:36
attachMovie und removeMovieClip wanst ActionScript 2 6 27-06-2008 11:34
attachMovie() - removeMovieClip() Kenji Flash 8 5 27-04-2008 21:31
attachMovie und removeMovieClip Jakozk ActionScript 2 4 25-04-2006 18:47
attachMovie und removeMovieClip hdance Flash MX 1 23-10-2005 17:48


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele