AS3性能:许多阵列与一个阵列+'是'

时间:2010-09-02 12:15:03

标签: flash actionscript-3 performance

我有很多显示对象要在运行时管理,因此我目前正在使用Arrays来管理它们。但问题是我有很多类型的显示对象(例如Tile,Npc和Building),它们基本上都是链接到库的MovieClip。每个显示对象扮演不同的角色,它将在输入框架上进行检查,即循环。

方法2听起来更加快速和可扩展但是我担心它是否会影响运行期间每个显示对象的检查率作为显示:数组变得更大并且可能使其变得不明智

以下哪种方法更快+更少故障并解释你选择它的原因。

提前致谢。

方法1

var tiles:Array = new Array()
var npcs:Array = new Array()
var buildings:Array = new Array()

function createTiles(){
for(var i:Number=0; i<10; i++){
var t:Tile = new Tile() //Display object in the library
t.x = i * 50
t.y = i * 50
addChild(t)
tiles.push(t)
}
}

function createNpcs(){...}
function createBuildings(){...}

addEventListener(Event.ENTER_FRAME, loop)

function loop(e:Event){
for(var i:Number=0; i<tiles.length; i++){
//some codes
}
for(var j:Number=0; j<npcs.length; j++){
//some codes
}
for(var k:Number=0; k<buildings.length; k++){
//some codes
}
}

方法2

var displays:Array = new Array();

function createDispalys(){
for(var i:Number=0; i<10; i++){
var t:Tile = new Tile() //Display object in the library
t.x = i * 50
t.y = i * 50
addChild(t)
displays.push(t)
}
for(var j:Number=0; j<10; j++){
//some code
displays.push(t)
}
for(var k:Number=0;k<10; k++){
//some codes
displays.push(t)
}
}
addEventListener(Event.ENTER_FRAME, loop)
function loop(e:Event){
for(var i:Number=0; i<display.length; i++){
if(display[i] is Tile){
//some codes
}else if(display[i] is Npc){
//some codes
}else if(display[i] is Building){
//some codes
}
}
}

3 个答案:

答案 0 :(得分:3)

您是否考虑过重构方法2将逻辑放入类本身?

即:

public interface DisplayAsset
{
     void onEnterFrame();
}

// Implementations ommitted
public class Npc implements DisplayAsset {}
public class Tile implements DisplayAsset {}
public class Building implements DisplayAsset {}

然后,您的循环仍然是可扩展的(只需添加另一个DisplayAsset impl。),并且快速 - 您的代码变为:

var displays:Array = new Array();  // As per Gregor Kiddie's comment, use a vector here if possible
// as a vector:
// var displays:Vector.<DisplayAsset> = new Vector.<DisplayAsset>();

function createDispalys(){
   for(var i:Number=0; i<10; i++){
     var t:Tile = new Tile() //Display object in the library
     t.x = i * 50
     t.y = i * 50
     addChild(t)
     displays.push(t)
   }
   for(var j:Number=0; j<10; j++){
       //some code
       displays.push(t)
    }
    for(var k:Number=0;k<10; k++){
       //some codes
       displays.push(t)
    }
}
addEventListener(Event.ENTER_FRAME, loop)
function loop(e:Event){
     for each (var displayAsset:DisplayAsset in displays)
     {
          displayAsset.onEnterFrame();
     }
 }

答案 1 :(得分:1)

如果您的表现与之相符,那么您应该使用Vectors代替。

答案 2 :(得分:0)

如何从一个基本类扩展这些类(Tile,Npc,Building) - 让我们说 TypeClass ,它有一个可覆盖的方法 getType()

此方法默认返回“None”,但通过展开类并覆盖方法,它可以返回“Tile”,“Npc”或“Building”...

有了这个,就可以制作 switch 语句,基本上更容易管理代码......

switch (anObject.getType()){
    case "etc"...
}