是否可以从内存中删除对象的实例并在以后的as3中恢复它?

时间:2014-03-20 02:12:31

标签: actionscript-3 flash

我的问题有点模糊,所以让我详细说明一下。我是一名初学程序员,正在开发我的第一个Flash游戏,就问题而言,这是一个像马里奥这样的横向滚动平台游戏。然而,与传统的平台游戏不同,等级将无限期地持续,直到玩家死亡或退出游戏。该级别是基于区块的,将通过一个数组自动生成,该数组指定每个图块中的对象(如果没有对象,则为0)。为了确保我的游戏不会因过多的物体而自动崩溃,我会在玩家前进的过程中生成更多的地图(通过创建对象的新实例),这样当玩家向右移动时,地图就会在边缘生成的屏幕。

现在回到手头的问题,我猜测一旦玩家到达游戏中的某个点,它将开始减速,因为正在创建越来越多的对象。 我假设这个问题的解决方案是在播放器进展时移除屏幕左侧的实例,但问题是我需要玩家能够回到关卡。

所以我的问题是:我怎样才能删除'或者从内存中删除实例,这样我的游戏就不会慢下来,但是当玩家移动到该实例所在位置(或者是)的某个附近时,还可以恢复实例。

注意:目前除玩家外,我在游戏中唯一的对象是“墙”。对象的所有实例都存储在' Wallarray'我目前仅用于引用Wall实例进行冲突检测的数组

3 个答案:

答案 0 :(得分:0)

请参阅我的评论,但无论哪种方式,它都可能是相同的答案。阅读SharedObject类,并使用SharedObjects进行一些简单的实验,将有关对象的信息写入磁盘,并重新读取该信息。

答案 1 :(得分:0)

我的建议是将游戏模型从其视角中分离出来。您将整个级别模型存储在一个单独的类和一个视图中,该视图将可见模型的部分呈现在舞台上。渲染引擎将删除屏幕外的可视对象,并创建可见的可视对象。您的模型将发送一些事件以通知您有关其更改的视图。希望这会有所帮助。

答案 2 :(得分:0)

我建议您使用对象池:当您的对象不再可见时,您可以将它们放在临时数组中,当您需要新对象时,而不是创建新对象,您可以从此数组中获取一个。

这里是他的游泳池对象的一个​​例子:

package
{

    public class Pooled extends MovieClip
    {
        /** the array containg objects created and not used **/
        protected static var _pool      :Vector.<Pooled>;
        /** the number of objects in the pool **/
        protected static var _nbItems   :int;

        public function Pooled()
        {

        }

        /** a function to dispose the object **/
        public function dispose():void
        {
            // do what you want here for release memory
        }

        /** the function to call to release the object and return it to the pool **/
        public function release():void
        {
            // do what you want here, stop animations, remove from parent, remove listeners ...
            // put it in the pool
            _pool[_nbItems++] = this;
        }

        /** a static function to initialize the object and to create the pool **/
        public static function init():void
        {
            _pool       = new Vector.<Pooled>();
            _nbItems    = 0;
        }

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

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

您必须首先调用静态init方法来创建池数组。 之后使用new Pooled();而不是使用Pooled.get();创建对象,如果可用,它将从池返回项目,如果没有,它将创建一个新项目。 如果您不再需要对象,可以调用release()函数,对象将被移动到池中。

使用此技术,内存中的最大对象将同时是最大显示对象。当池包含对象时,您可以避免创建新对象的时间。

希望这可以帮到你。