2009-06-26 2 views
0

У меня есть объект Array of Character Character (расширяет Sprite).Лучший способ повторного использования элемента из массива?

public static var charlist:Array; 

Когда персонаж умирает, я устанавливаю флаг для указания этого.

char.die = true; 

Когда я создаю нового игрока, я проверяю этот флаг, чтобы повторно использовать слот. Здесь возникает проблема. Каков наилучший способ сделать это? На самом деле у меня есть такой подход:

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

Но проблема в том, что я родом из C++, и я думаю, что для расчета индекса каждой итерации является расточительным.
Я хотел бы сделать это, но это не работает в AS3, так как я не могу получить доступ по ссылке пункт:

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; 
    } 
} 

Просто примечание: charlist является статическим членом класса Char.

У вас есть идеи или лучшие подходы?

Спасибо!

ответ

2

«оптимизированный «Я думаю, что версия мало оптимистична.

Ваш код не выполняет 2 обращения на каждой итерации. Это происходит только тогда, когда вы обнаруживаете мертвого Шар; и после этого вы вернетесь. Так что, я думаю, ничего страшного.

Лично я не думаю, что повторное использование слотов в массиве также будет иметь большое значение. И, может быть, это может ухудшиться (но хуже всего то, что ваш код может быть проще, если вы его избегаете). Предположим, у вас есть 100 символов, 60 из которых мертвы, и у вас есть цикл, который запускает каждый кадр и выполняет чек/действие на каждом живом персонаже. Вы бы зацикливали более 100 символов, когда вы могли бы перебрать более 40, если бы вы выполнили список живых объектов и разделительный список мертвых объектов, готовых к их повторному использованию. Кроме того, «мертвый список» можно обрабатывать как стек, поэтому для получения символа не требуется итерации.

Во всяком случае, я вижу 2 вещи, которые вы могли бы легко оптимизировать в вашем коде:

1) получить длину списка вне цикла:

ли это:

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

Вместо этого:

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

Компилятор не будет оптимизировать вызов по длине (после ecmasc ript spec).

2) Избегайте статического доступа (для charlist). Известно, что он значительно медленнее, чем доступ к экземпляру.

Edit:

Перечитывая свой вопрос, я понимаю, что я понял его часть. Вы не пытаетесь повторно использовать объекты Char, а скорее массивы. Тем не менее, я не думаю, что многократно использовать слоты для массивов (массивы в ActionScript не фиксированы); но что-то, что может помочь производительности, - это повторное использование объектов Char. Сброс Sprite обычно дешевле, чем создание нового. Вы можете управлять этим с пулом «мертвых» объектов, из которого вы можете взять один и «вернуть его к жизни», когда вам нужно, вместо создания нового.

Это разместить переговоры об объекте бассейнах (сам блог является хорошим источником для Actionscript материала, особенно для производительности и структуры данных тем, стоит посмотреть):

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

+0

Великих документации, когда я приду Вернемся к этому проекту, я проверю эту информацию. – Veehmot

0

Почему бы не использовать список вместо массива и просто удалить мертвые из списка и добавить новый, если необходимо?
Есть ли веская причина попытаться повторно использовать слот?
Что вы пытаетесь оптимизировать?

0

Есть ли причина, по которой вы не можете просто соединить искомый символ и нажать новый символ на массив?

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

Если вы ищете для хранения ссылки, фотографии AS3-х Dictionary объект или даже Flash 10 в вектор (если хранение соответствует по типу, довольно быстро):

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

Смежные вопросы