Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Объекты останавливаются на сцене (http://www.flasher.ru/forum/showthread.php?t=157364)

КорДум 06.06.2011 12:25

Цитата:

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

andrew911 06.06.2011 15:10

Цитата:

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

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

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

Цитата:

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

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

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

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

Cornford 07.06.2011 12:36

Вот пример реализации кеш менеджера:
http://www.ant-karlov.ru/TowerDefenc...e-obektov.html

ndez 08.06.2011 17:57

Спасибо, буду пробовать.

ndez 14.06.2011 16:38

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

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() из другого класса, а то я конечно сочинил вариант, но потом убрал дабы не позорится
Код AS3:

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



Часовой пояс GMT +4, время: 05:58.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.