【问题标题】:AS3 stack overflow?AS3 堆栈溢出?
【发布时间】:2013-02-20 05:56:53
【问题描述】:

使用数组。我在类基础上创建对象,将它们推入数组,我有 2 个按钮:一个添加一个子项并将其推入数组,第二个按钮移动数组并删除子项。也是我鼠标上的一个功能,如果我单击一个对象,我将其定义为数组编号,删除子项,然后......好吧,不确定是否成功,但“delete Array[i];”在哪里我是目标的数组编号。每次我做某事时,我都可以在文本字段中看到 Array.length。第二个按钮实际上确实从数组中删除了一个对象,数量减少了。但是从 Array 中删除指定的对象以及 Array.slice(i,1) 不会减少 Array 的长度。所以我担心它可能会导致溢出。只是阵列,不确定,也许阵列中有超过一百万个单元格就可以了吗? 就像我用流星雨做游戏一样,流星从屏幕上移除,但阵列仍然有它们的细胞。如果它们看起来像每秒 30-50 次,很明显我可能会在运行 20 分钟后出现内存问题。嗯,它是 60k,所以也许 我不应该担心,因为只有图形会占用很多内存?

不过,我可以使用有关如何在数组中间移动对象的建议。选一个。 我如何删除它,就像它从未被创建一样,就像 Shift 一样? (确实如此,对吗?)

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    Array.splice() 将完成大部分技巧。当您将流星移出屏幕时,您可以将其从阵列中拼接出来,如下所示:

    var i:int=meteorArray.indexOf(meteorToRemove);
    if (i>=0) meteorArray.splice(i,1);
    

    【讨论】:

    • 我发誓 Flash 正试图杀死我的大脑!以前试过,不行,现在可以了。 XD 非常感谢!
    【解决方案2】:

    如果要删除其他对象,最好不要创建新对象。尝试回收,或者更好地称为“对象池”

    您应该算出一次可以使用的最大元素数。在每个上创建一个“活动”属性并将其设置为 true 或 false,而不是创建/删除。然后您可以对每个对象运行更新并仅在必要时更新它

    例如:

    var meteors:Array = [];
    
    // create 500 meteors
    for ( var i:int = 0; i < 500; i++ ) {
      var meteor:Meteor = new Meteor();
      meteor.active = false;
      meteors.push(meteor);
    }
    
    // enable one meteor
    meteors[0].active = true;
    
    // in your update method:
    for each (var meteor in meteors ) 
      if ( meteor.active )
        meteor.update();
    

    希望对您有所帮助。

    您还可以添加一个辅助方法来获取可用的流星:

    function getMeteorAvailable():Meteor
    {
      for each (var meteor in meteors ) 
          if ( !meteor.active )
            return meteor;
    }
    

    【讨论】:

    • 一个人必须先学会走路才能飞。显然,他学会了如何爬行。虽然这个想法是正确的,但对他来说还是太先进了,恕我直言。
    • Vesper,我学得很快 =P mika,谢谢,会试试,比清除数组或创建一个新数组更棘手,但有道理 =D
    • 就在@SherWood 上如果您有相关问题,请随时评论此线程
    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2012-04-15
    • 2012-12-20
    • 2011-03-02
    相关资源
    最近更新 更多