Лучший способ повторно использовать элемент из массива? - PullRequest
0 голосов
/ 26 июня 2009

У меня есть объекты Array of Characters (расширяет 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.

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 27 июня 2009

«Оптимизированная» версия, я думаю, не слишком оптимизирует.

Ваш код не выполняет 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++) {

Компилятор не оптимизирует вызов длины (следуя спецификации ecmascript).

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

Edit:

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

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

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

0 голосов
/ 26 июня 2009

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

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

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

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

0 голосов
/ 26 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...