2009-06-26 15 views
0

Ich habe ein Array von Zeichen Objekten (erweitert Sprite).Die beste Möglichkeit, ein Element aus einem Array wiederzuverwenden?

Wenn ein Charakter stirbt, setze ich eine Flagge, um das anzuzeigen.

Wenn ich einen neuen Player spawne, überprüfe ich diese Flagge, um den Slot wiederzuverwenden. Hier kommt das Problem auf. Was ist der beste Weg, das zu tun? Eigentlich habe ich diesen Ansatz:

char = new Char(); 
/* ... */ 
for (var i:Number = 0; i < Char.charlist.length; i++) { 
    if (Char.charlist[i].death) { 
     Char.charlist[i] = char; 
     return; 
    } 
} 

Aber das Problem ist, dass ich von C++ kommen und ich denke, die Berechnung des Index jeder Iteration verschwenderisch ist.
Ich würde dies tun, aber dies in AS3 nicht funktioniert, da ich nicht durch Referenz um den Artikel zugreifen:

char = new Char(); 
/* ... */ 
for (var i:Number = 0; i < Char.charlist.length; i++) { 
    var char_it:Char = Char.charlist[i]; 
    if (char_it.death) { 
     char_it = char; 
     return; 
    } 
} 

Nur ein Hinweis: charlist ist ein statisches Member der Klasse Char.

Haben Sie irgendwelche Ideen oder bessere Ansätze?

Danke!

Antwort

2

Die „optimiert "Version optimiert nicht viel, denke ich.

Ihr Code führt nicht in jeder Iteration 2 Zugriffe durch. Es passiert nur, wenn du zufällig einen toten Char findest; und danach kommst du zurück. Also, keine große Sache, denke ich.

Ich persönlich glaube nicht, die Wiederverwendung von Array-Slots entweder einen großen Unterschied machen wird. Und, vielleicht könnte es degradieren (aber das Schlimmste ist, dass Ihr Code einfacher sein könnte, wenn Sie es vermeiden). Angenommen, Sie haben 100 Zeichen, von denen 60 tot sind, und Sie haben eine Schleife, die jeden Frame ausführt und einige Checks/Aktionen für jeden Live-Char durchführt. Sie würden mehr als 100 Zeichen durchlaufen, wenn Sie mehr als 40 durchlaufen könnten, wenn Sie eine Liste von Live-Objekten und eine separate Liste von toten Objekten verwalten würden, um sie wiederzuverwenden. Außerdem kann die "Dead List" als Stapel behandelt werden, so dass keine Iteration benötigt wird, um ein Zeichen zu erhalten.

Wie auch immer, ich sehe zwei Dinge, die Sie leicht in Ihren Code optimieren könnte:

1) Abrufen der Liste Länge außerhalb der Schleife:

tun:

var len:int = Char.charlist.length; 
for (var i:Number = 0; i < len; i++) { 

Statt dessen:

for (var i:Number = 0; i < Char.charlist.length; i++) { 

Der Compiler wird den Anruf zu Länge (nach der ecmasc nicht optimieren entfernt Handelsspezifikation).

2) Vermeiden Sie statischen Zugriff (für charlist). Es ist bekannt, dass es wesentlich langsamer ist als der Instanzenzugriff.

Edit:

Re-Lektüre Ihrer Frage, ich weiß, ich ein Teil davon falsch verstanden. Sie versuchen nicht, Char-Objekte, sondern Array-Slots wiederzuverwenden. Dennoch glaube ich nicht, dass die Wiederverwendung von Array-Slots es wert ist (Arrays in Actionscript sind nicht fest); Aber etwas, das die Leistung verbessern könnte, ist die Wiederverwendung der Char-Objekte selbst. Das Zurücksetzen eines Sprites ist in der Regel günstiger als das Erstellen eines neuen. Sie können dies mit einem Pool von "toten" Objekten verwalten, aus denen Sie einen holen und ihn wieder zum Leben erwecken können, anstatt einen neuen zu erstellen.

Dieser Beitrag spricht über Objekt Pools (das Blog selbst ist eine gute Quelle für Actionscript Sachen, insbesondere für die Leistung und Datenstrukturen Themen, lohnt sich ein Blick):

http://lab.polygonal.de/2008/06/18/using-object-pools/

+0

Groß Dokumentation, wenn ich komme Zurück zu diesem Projekt werde ich diese Informationen überprüfen. – Veehmot

0

Warum nicht eine Liste anstelle von Array verwenden und einfach tote aus der Liste entfernen und bei Bedarf neue hinzufügen?
Gibt es einen guten Grund zu versuchen, den Steckplatz wieder zu verwenden?
Was möchten Sie optimieren?

0

Gibt es einen Grund, warum Sie können nicht nur das gewünschte Zeichen Spleiß und einen neuen Charakter auf das Array schieben?

var characters:Array = ["leo", "raph", "don", "mike"]; 
characters.splice(1, 1); 
trace(characters); 
characters.push("splinter"); 
trace(characters); 

Wenn Sie sich für die Speicherung von Referenz suchen, die Kasse AS3 Dictionary Objekt oder sogar Vectors Flash 10 (wenn die Lagerung von Typ konsistent ist, ganz schnell):

http://www.gskinner.com/blog/archives/2006/07/as3_dictionary.html

Verwandte Themen