PDA

Просмотр полной версии : Объекты останавливаются на сцене


ndez
04.06.2011, 15:29
Доброго времени суток. У меня вот какой вопрос : добавляются объекты на сцену, объекты двигаются, в разных направлениях, а потом некоторые останавливатся, а некоторые двигаются или все останавливаются. Движение объектов по средством Event.ENTER_FRAME (через Timer мне не подходит). Код большой, приводить не буду, хочу узнать - может у кого есть какие соображения (может кто сталкивался с подобным) в каком направлении работать???

Bgg
04.06.2011, 15:35
В чем вопрос заключается?

ndez
04.06.2011, 15:41
Почему останавливаются объекты??? Такое впечатление, что Event.ENTER_FRAME для остановившихся объектов больше не доступен.

Bgg
04.06.2011, 15:44
Потому что где-то косяк в вашем коде.

ndez
04.06.2011, 15:53
Логично. Я пишу игруху. На сцену добовляю ботов - порядка 10 - двигаются - потом остановились. За это время я не каких действий не произвожу. Время остановки спонтанное (примерно через минуту - две). Дальше полет пуль- вроде летят, но иногда застывает на месте, может через минуту, может через пять такое произойти, а может и не произойти. При этом дальше стреляет и другие пули летят и умирают потом как положено. Попробую пример коротенький сделать.

Bgg
04.06.2011, 15:55
Оч классно. Но без кода хз как вам помочь.

ndez
06.06.2011, 04:35
Вот такой код подсократил, для примера, здесь объекты останавливаются через 1-7 минут. Обычно через 4-5 минут.

andrew911
06.06.2011, 05:21
Почему останавливаются объекты??? Такое впечатление, что Event.ENTER_FRAME для остановившихся объектов больше не доступен.

Это объекты недоступны становятся, вы нигде не сохраняете на них ссылку и их подчищает garbage collector


private function botsTimer_timer(e:TimerEvent):void
{
bot = new Bot(main);
if (Bot.botLoad == 10)
{
bTimer.stop();
}
}


Заносите их например в массив

private var bots:Array = [];
...

bot = new Bot(main);
bots.push(bot);

Ну и советую обрабатывать всех ботов в одном ENTER_FRAME, а не плодить его для каждого бота.

ndez
06.06.2011, 06:02
Это первая моя игрушка, много чего не знаю. Это пример, реально ботов много видов и появляются они спонтанно. И количество их больше 10. Десять - я ограничил, что бы одновременно были на сцене, но при этом таймер не останавливается, а просто не появляются на сцене новые боты. Как только становится меньше - снова появляются. Но стоит оставить без движения и поражения ботов игрушку(а иногда и в процессе игры) - останавливаются боты.

Опять же если убрать классы пуль и оставить в данном примере только летающие боты - то в течении 10 минут они точно не останавливаются(дальше ждать не стал). Или в данном случае garbage collector просто не срабатывает???

Попробую массив, ботов конечное число, а вот как быть с пулями??? В данном примере нормально летают, а в реальном пули ботов и пули героя порой также зависают. И эти объекты доступны - об зависшие пули взрываются боты или уменьшается жизнь героя. И они удаляются со сцены когда значение контенер.numChild-1 соответствует данному объекту, но на это требуется время и соответственно появление новых пуль.

И еще хотел спросить - в процессе игры загрузка ЦП составляет примерно 20-30%(увеличивается постепенно) - мне кажется это много???

Cornford
06.06.2011, 09:35
У меня тоже такое было я делал движения тоннеля через твин стандартный флешевский. через пару минут он останавливался. потом стал использовать TweenMax проблема решилась. Кроме того лучше всего использовать кэш менеджер для создания объектов тогда их не надо будет каждый раз создавать занова.

КорДум
06.06.2011, 12:25
У меня тоже такое было я делал движения тоннеля через твин стандартный флешевский. через пару минут он останавливался. потом стал использовать TweenMax проблема решилась
Нужно сохранять ссылку на твин. В любом случае.

andrew911
06.06.2011, 15:10
Это первая моя игрушка, много чего не знаю. Это пример, реально ботов много видов и появляются они спонтанно. И количество их больше 10. Десять - я ограничил, что бы одновременно были на сцене, но при этом таймер не останавливается, а просто не появляются на сцене новые боты. Как только становится меньше - снова появляются. Но стоит оставить без движения и поражения ботов игрушку(а иногда и в процессе игры) - останавливаются боты.

Опять же если убрать классы пуль и оставить в данном примере только летающие боты - то в течении 10 минут они точно не останавливаются(дальше ждать не стал). Или в данном случае garbage collector просто не срабатывает???

Да, он срабатывает при определенных условиях. Несколько ботов занимают немного памяти, а постоянное создание пуль приводит к росту занятой памяти.


Попробую массив, ботов конечное число, а вот как быть с пулями??? В данном примере нормально летают, а в реальном пули ботов и пули героя порой также зависают. И эти объекты доступны - об зависшие пули взрываются боты или уменьшается жизнь героя. И они удаляются со сцены когда значение контенер.numChild-1 соответствует данному объекту, но на это требуется время и соответственно появление новых пуль.

И еще хотел спросить - в процессе игры загрузка ЦП составляет примерно 20-30%(увеличивается постепенно) - мне кажется это много???

Как уже написали используйте "кэш менеджер для создания объектов" (object pool), при этом объекты достаются из кэша, отрабатывают и отправляются обратно в кэш, при этом нет постоянного роста памяти.

Загрузка зависит от характеристик ЦП.
Для начала, как я уже писал, вынесите все обработки Event.ENTER_FRAME из ботов и пуль, например, в общий менеджер объектов.

Cornford
07.06.2011, 12:36
Вот пример реализации кеш менеджера:
http://www.ant-karlov.ru/TowerDefence9-keshirovanie-obektov.html

ndez
08.06.2011, 17:57
Спасибо, буду пробовать.

ndez
14.06.2011, 16:38
Доброго времени суток. Попробовал сделать менеджер объектов по образу и подобию http://www.ant-karlov.ru/TowerDefenc...e-obektov.html и как то у меня не получается. Вроде бы все летает и стреляет и процессор в порядке, но:
Сначала заполняется массив и с этим порядок, а потом когда начинается обращение к функции get() для извлечения объектов - на сцене они не появляются, только когда _currentIndex=-1, начинают создаваться новые объекты и появляться на сцене. Но ведь это не правельно!

package {

import flash.display.Sprite;
import flash.display.Stage;

public class SimpleCache {

public var main:Main;
protected var _targetClass:Class;
protected var _currentIndex:int;
public static var _currentIndexBot:int;
public static var _currentIndexPuly:int;
protected var _instances:Array;


public function SimpleCache( targetClass:Class, initialCapacity:uint, nain) {
main = nain;
_targetClass = targetClass; // Базовый класс всех объектов
_currentIndex = initialCapacity - 1; // Индекс текущего свободного объекта
_instances = []; // Список всех объектов
// Заполняем обойму
for (var i:int = 0; i < initialCapacity; i++) {
_instances[i] = getNewInstance();
}
}
protected function getNewInstance():Object {
return new _targetClass(main);
}
public function get():Object {

if (_currentIndex >= 0) {
// Здесь должен извлекаться объект из массива, но на сцене он не появляется
_currentIndex--;
return _instances[_currentIndex + 1];
}
else{
// Когда _currentIndex = -1, создаются новые объекты и они появляются на сцене
return getNewInstance();
}
}
public function set(instance:Object):void{
_currentIndex++;
if (_currentIndex == _instances.length) {
_instances[_instances.length] = instance;
}
else{
_instances[_currentIndex] = instance;
}
}
}
}

И еще очень прошу - объясните мне как обратится к функции set() из другого класса, а то я конечно сочинил вариант, но потом убрал дабы не позорится

public class BotPuly extends Sprite {
.
.
.
private function self_destructionBotPuly() {
if (botpulyphoto != null) {
if (main.contenerBotPuly.contains(botpulyphoto)) {
main.contenerBotPuly.removeChildAt(main.contenerBotPuly.numChildren - 1);


//Здесь должен быть вызов set(instance:Object) только я не знаю как это правельно сделать

}
removeEventListener(Event.ENTER_FRAME, onEnterBotPuly);
botpulyphoto = null;
}

}