PDA

Volledige versie bekijken : Opruimen na spel


e.l.dam
%Europe/Berlin %459 %2009, 11:02
Hallo allemaal,

Bijna klaar met een nieuw spelletje en wederom de vraag: hoe ver moet ik gaan met het opruimen.

Ik heb een class waar alles aangeroepen wordt: het menu, de tutorial, het spel, etc.

Wanneer het spel afgelopen is, gooi ik eerst alle EventListeners weg (twee redenen, één omdat ze volgens mij anders nog in het geheugen blijven staan? en twee omdat je tijdens de score invullen niet verder mag spelen).

Daarna wordt buildMenu() aangeroepen, welke zo begint:

public function buildMenu():void {
if (mnGame) {
removeChild(mnGame);
mnGame = null;
}

Mijn vraag is nu: hoe ver moet ik gaan met het opruimen van mnGame. Als ik de hele child remove (met daarin een ton aan EventListeners en graphics en meuk), is dan alles weg? Of moet ik eerst binnen mnGame alle inhoud apart verwijderen en daarna pas de child mnGame weg gooien?

It troubles me! :) Het lijkt erop dat op deze manier mijn spel niet langzamer wordt na 10.000 keer proberen (trace(System.totalMemory) geeft steeds ongeveer dezelfde waardes), maar ik weet dus niet of sommige "verwijder" dingen overbodig zijn (zoals het weggooien van Listeners).

Stukje wat ik nu doe in de game, voordat je terugkeert naar het menu, is:

for (var i:uint=0; i<blockList.length; i++) {
removeChild(blockList[i]);
}

Overbodig als je in het menu de hele game (met daarin de blockList) removed en op null zet?

Hoop dat mijn vraag duidelijk is... elke game die ik heb gemaakt heb ik nog het probleem gehad dat als je hem 100x speelt, hij steeds langzamer wordt. Elke keer anders opgelost, wil nu wel eens weten wat ik precies moet doen :)

Bedankt in iedergeval!

Groetjes

B-Mantis
%Europe/Berlin %528 %2009, 12:41
je moet alle event listener removen. Wat ik zelf altijd doe, is alleen event listeners toevoegen in de document class, denk aan keydown, mouse events, enter frame, etc, en vervolgens die class alles laten oproepen door child.handleEnterFrame() aan te roepen.

verder zorg ik dat alle children die zelf naar bepaalde (custom) events luisteren een destroy() functie hebben, en dat de document class die functie aanroept als een level wordt verwijderd. In die destroy functie kunnen ze hun listeners verwijderen.

Verder mag datgene wat je verwijderd geen referenties meer hebben naar bijv. de document class, maar, dat hebben ze als het goed is ook niet, want da's niet netjes programmeren.

zodra je een level hebt, met daarin een player, en 200 enemies, en wolkjes, etc, en dat verwijst allemaal naar elkaar, hoef je alleen maar het level te verwijderen. Mark & Sweep zorgt er dan voor dat alles verwijderd wordt.

Wat ik zelf altijd doe om te testen of iets daadwerkelijk verwijderd wordt:

function gcTest(e:Event):void {
trace(child.name);
}
child.addEventListener(Event.ENTER_FRAME, gcTest, false, 0, true);//laatste argument- weak listener

als ie nu verwijderd wordt, gaat ie zijn naam tracen met een weak listener. Na verloop van tijd zal ie stoppen met tracen, omdat ie dan gegarbage-collect is.

e.l.dam
%Europe/Berlin %684 %2009, 16:25
Heel erg bedankt! Helderd weer het een en ander op :p