2014-02-16 4 views
0

Мы пара ребят, играющих в игры. Данные игровых объектов хранятся во вложенных массивах. Массив верхнего уровня содержит массивы, которые соответствуют одному объекту каждый. Под объектом я подразумеваю параметры игровых объектов, хранящиеся в массиве, и объект скворца, упомянутый в массиве.AS3, утилизация объектов скворца

Эти суб-массивы имеют ссылку на скрининг-мувиклип или скворец-спрайт и около 15 других переменных для этого объекта. Поэтому переменные не сохраняются в самом файле movieclip/sprite по разным причинам. Возможность Blitting является одним из них.

Вопрос в том, как организовать это наилучшим образом и в конечном итоге реализовать утилизацию скворцов, чтобы получить меньше проблем с сборкой мусора. У меня есть три предложения, но я знаю, что что-то еще может быть лучше.

1) один «погост» контейнер для каждого класса объекта: один для астероидов, один для playershots, один для .... Всякий раз, когда объект уничтожается, соответствующий объект будет идти на правильное кладбище. Всякий раз, когда сущность того же класса должна быть создана, затем повторно используйте один из соответствующего контейнера, если он содержит какой-либо.

2) Один большой контейнер для всех уничтоженных мувиклипов и спрайтов. Всякий раз, когда будет создан спрайт или мувиклип, повторно используйте объект из этого контейнера, если он содержит какой-либо. Также должна быть установлена ​​правильная анимация. Я не знаю, требует ли это много процессора или вообще возможно.

3) Пусть сбор мусора позаботится об уничтоженных мувиклипах и спрайтах. Не перерабатывайте их.

+0

Я работаю с flashpunk. Итак, я попытался использовать этот recyling материал, чтобы улучшить производительность игры. Но игра стала настолько сложной, мне также нужна была такая система, как ваша, я имею в виду, ссылаясь на материал сущности на массивы и тому подобное ... Но передислокация стала настоящей проблемой, я пробовал много вещей чтобы решить эту проблему, но каждое решение создавало еще одну проблему! Итак, я отказался от использования recyling ... –

ответ

0

лична, когда я хочу, чтобы делать такие вещи, как это я переопределить базовый класс я хочу использовать и добавить некоторый код, чтобы сделать, что вы хотите:

Например, класс Астероида расширение MovieClip:

package 
{ 
    import starling.display.MovieClip; 
    import starling.textures.Texture; 

    public class Asteroid extends MovieClip 
    { 
     /** a object pool for the Asteroids **/ 
     protected static var _pool  :Vector.<Asteroid>; 
     /** the number of objects in the pool **/ 
     protected static var _nbItems :int; 
     /** a static variable containing the textures **/ 
     protected static var _textures :Vector.<Texture>; 
     /** a static variable containing the textures **/ 
     protected static var _fps  :int; 

     public function Asteroid() 
     { 
      super(_textures, 60); 
     } 

     /** a static function to initialize the asteroids textures and fps and to create the pool **/ 
     public static function init(textures:Vector.<Texture>, fps:int):void 
     { 
      _textures = textures; 
      _fps  = fps; 

      _pool  = new Vector.<Asteroid>(); 
      _nbItems = 0; 
     } 

     /** the function to call to release the object and return it to the pool **/ 
     public function release():void 
     { 
      // make sure it don't have listeners 
      this.removeEventListeners(); 
      // put it in the pool 
      _pool[_nbItems++] = this; 
     } 

     /** a static function to get an asteroid from the pool **/ 
     public static function get():Asteroid 
     { 
      var a :Asteroid; 
      if(_nbItems > 0) 
      { 
       a = _pool.pop(); 
       _nbItems--; 
      } 
      else 
      { 
       a = new Asteroid(); 
      } 
      return a; 
     } 

     /** a static function to destroy asteroids and the pool **/ 
     public static function dispose():void 
     { 
      for(var i:int = 0; i<_nbItems; ++i) _pool[i].removeFromParent(true); 
      _pool.length = 0; 
      _pool = null; 
     } 
    } 
} 

Итак, у вас может быть астероид с методом Asteroid.get();, он получит астероид в пуле или создаст его, если пул пуст.

Перед тем, как должно инициализировать класс со статической функцией Asteroid.init(textures, fps)

Когда вам не нужен астероид больше вы можете вызвать myAsteroid.release(); это вернет астероид в пул для последующего использования.

Если вам больше не нужны астероиды, вы можете вызвать статический Asteroid.dispose();, чтобы очистить бассейн.

Надеюсь, это может вам помочь.