Производительность AS3: многие массивы против одного массива + 'is' - PullRequest
0 голосов
/ 02 сентября 2010

У меня достаточно много экранных объектов для управления во время выполнения, поэтому я в настоящее время использую массивы для управления ими.Но проблема в том, что у меня есть несколько типов экранных объектов (например, Tile, Npc и Building), которые в основном связаны с мувиклипами, связанными с библиотекой.Каждый экранный объект играет различную роль, где он будет проверяться при вводе кадра, в цикле.

Метод 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 ]

3 голосов
/ 02 сентября 2010

Рассматривали ли вы метод рефакторинга 2, чтобы поместить логику в сам класс?

Т.е.:

public interface DisplayAsset
{
     void onEnterFrame();
}

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

Затем ваш цикл остается расширяемым (просто добавьте еще один имплимент DisplayAsset),и быстро - ваш код становится:

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 голос
/ 02 сентября 2010

Если производительность - то, что вам нужно, вместо этого следует использовать Векторы .

0 голосов
/ 02 сентября 2010

Как насчет расширения этих классов (Tile, Npc, Building) из одного базового класса - скажем, TypeClass , который имеет перезаписываемый метод getType () .

Этот метод возвращает «None» по умолчанию, но, расширив класс и переписав метод, он может вернуть «Tile», «Npc» или «Building» ...

С этим можно сделать switch операторов, и в основном проще управлять кодом ...

switch (anObject.getType()){
    case "etc"...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...