AS3堆栈溢出?

时间:2013-02-20 05:56:54

标签: actionscript-3

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果要删除其他对象,则不应创建新对象。尝试回收,或者更好地说'对象池'

您应该计算一次可以使用的元素的最大数量。在每个属性上创建一个“活动”属性,并将其设置为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;
}