【问题标题】:Is it possible to remove an instance of an object from memory and restore it later in as3?是否可以从内存中删除对象的实例并稍后在 as3 中恢复它?
【发布时间】:2014-03-20 02:12:31
【问题描述】:

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

现在回到手头的问题,我猜一旦玩家到达游戏中的某个点,它就会开始放慢速度,因为正在创建越来越多的对象。 我认为这个问题的解决方案是随着玩家的进展移除屏幕左侧的实例,但问题是我需要玩家能够返回关卡。

所以我的问题是:我怎样才能从内存中“删除”或删除实例,这样我的游戏才不会变慢,而且当玩家移动到该实例所在位置的某个附近时(或是)。

注意:目前,除了玩家之外,我在游戏中唯一的对象是“墙”对象,其所有实例都存储在“墙阵列”数组中,我目前仅用于引用墙的实例以进行碰撞检测

【问题讨论】:

  • 您是否只在玩游戏期间或在游戏会话之间保留有关屏幕外对象的信息? I.o.w.,你想让玩家明天从他们今天离开的地方重新开始游戏吗?
  • 你必须明白,即使你可以通过从游戏中移除元素来节省 CPU 周期,你也只能存储你的 RAM 所能容纳的关于访问区域的尽可能多的信息。从那里,您可以将这些数据传递到 HD 上的文件或某个数据库。

标签: actionscript-3 flash


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      这里是一个带有他的池的对象示例:

      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() 函数,该对象将被移动到池中。

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

      希望这对你有帮助。

      【讨论】:

        猜你喜欢
        • 2015-07-01
        • 1970-01-01
        • 2017-08-24
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 2014-06-27
        相关资源
        最近更新 更多