AS3,回收八哥对象

时间:2014-02-16 15:53:40

标签: actionscript-3 object collections garbage recycle

我们是几个制作游戏的人。游戏实体的数据存储在嵌套数组中。顶级数组包含数组,每个数组对应一个实体。实体是指存储在数组中的游戏对象参数和数组中引用的starling对象。

这些子阵列引用了starling movieclip或starling sprite以及该实体的大约15个其他变量。因此,由于各种原因,变量不会存储在movieclip / sprite中。 Blitting的可能性就是其中之一。

问题是如何以最好的方式组织这个并最终实现starling对象的回收以减少垃圾收集的问题。 我有三个建议,但我知道,其他的东西可能更好。

1) 每个物体都有一个“墓地”容器:一个用于小行星,一个用于玩家,一个用于.... 每当实体被销毁时,相应的对象将进入正确的坟墓场。每当创建相同类的实体时,如果它拥有任何实体,则从相应的容器中重用一个实体。

2) 所有被毁的动画片段和精灵的一个大容器。 每当sprite或movieclip产生时,如果它拥有任何对象,则重用该容器中的对象。还应设置正确的动画。我不知道是否需要大量的cpu或者是否可能。

3) 让垃圾收集处理被破坏的动画片段和精灵。不要回收它们。

1 个答案:

答案 0 :(得分:0)

个人,当我想做这样的事情时,我会覆盖我想要使用的基类,并添加一些代码来做你想要的:

例如Asteroid类扩展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();来清除池。

希望这可以帮到你。