当我创建许多物体时,kineticjs减速

时间:2014-07-09 09:12:10

标签: javascript performance kineticjs

我是使用javascript和kineticJs的新手。我有一点问题,当我创建了许多对象时,动画变慢了。我以为我用.destory()删除了那些对象,但我认为不是因为项目进展缓慢。

这是我的代码:

var framesSegundo = 1000/20; //1000 seconds 20 frames
var stage, fondo;
var personaje;
var intv;
// calculate the time between one enemy and the oher one
var SegEneCreado = 0 ;
var layer = new Kinetic.Layer();
//Group with the chrachters
var grupoPersonajes = new Kinetic.Group({});
var grupoEnemigos = new Kinetic.Group({});
// screen create
var stage = new Kinetic.Stage({
        container: 'game',
        width: 960,
        height: 640
      });

//Level Create
function creaNivel(){
    //creamos un personaje
    personaje = new Kinetic.Rect({
      width: 100,
      height: 50,
      x: 10,
      y: stage.getHeight()/2,
      fill: 'red'    
    });
    grupoPersonajes.add(personaje);
    layer.add(grupoPersonajes);    
    stage.add(layer);
}

//Create the enemies
function creaEnemigos(){   
   // we left the time of one second to create enother enemy
   if (SegEneCreado <= 0){      
      if (aleatorio(0,1000)>970){  
         SegEneCreado = framesSegundo;
         //create the enemies
         var tipoEnemigo = parseInt(aleatorio(0,3));
         if (tipoEnemigo == 0){
            var enemigo = createEnemy(stage.getWidth() + 10, 0, 'green');            
         }
         else if (tipoEnemigo == 1){
            var enemigo = createEnemy(stage.getWidth() + 10, 0, 'blue');                        
         }
         else if (tipoEnemigo == 2){
            var enemigo = createEnemy(stage.getWidth() + 10, 0, 'yellow');            
         }
         else {
            var enemigo = createEnemy(stage.getWidth() + 10, 0, 'C48BD9');            
         }
         enemigo.setY(aleatorio(0,stage.getHeight() - enemigo.getHeight()));         
         grupoEnemigos.add(enemigo);
         layer.add(grupoEnemigos);    
         stage.add(layer);
      }
   }
   else{
      SegEneCreado--;
   }
}

function MoverEnemigos(){
   for (i in grupoEnemigos.children){
      var asset = grupoEnemigos.children[i];
      asset.move(-5,0);
      if (asset.getX() + asset.getWidth()<0){
        console.log(asset.getX() + asset.getWidth()<0);
        asset.move(0,0);         
        asset.remove();
      }
   }

}

//random value
function aleatorio(inferior, superior){
   var posibilidades = superior - inferior;
   var random = Math.random() * posibilidades;
   random = Math.floor(random);   
   return inferior + random;
}

function createEnemy(x, y, color){
  var enemy = new Kinetic.Rect({
      width: 100,
      height: 50,
      x: x,
      y:0,
      fill: color    
    });
  return enemy
}

creaNivel();
intv = setInterval(frameLoop,framesSegundo); 

function frameLoop(){
   creaEnemigos();
   MoverEnemigos();
   stage.draw();
}

我在论坛上也是新人......我发现事情发展缓慢,但我认为这是一个不同的问题。

由于

1 个答案:

答案 0 :(得分:2)

asset.remove将敌人从画布上移开,但不会摧毁敌人的物体。

使用asset.destroy删除敌方对象使用的资源。

&#34;回收&#34;会更有效率。你的敌人,而不是重建一个新的敌人:

当敌人离开舞台时,将其X属性设置为-100以表示其处于非活动状态

function MoverEnemigos(){
   for (i in grupoEnemigos.children){
      var asset = grupoEnemigos.children[i];
      if(asset.x()==-100){
          // enemy is inactive, do nothing
      }else{
          // enemy is active
          asset.move(-5,0);
          if (asset.getX() + asset.getWidth()<0){
              // enemy is offstage so make enemy inactive
              asset.x(-100);
      }
   }
}

然后,当你需要一个新的敌人时,你可以找到一个不活跃的敌人,重置其属性。

function createEnemy(x, y, color){

    // see if there is an inactive enemy to reuse
    for (i in grupoEnemigos.children){
      var asset = grupoEnemigos.children[i];
      if(asset.x()==-100){
          // this enemy is inactive, reuse it
          asset.x(x);
          asset.y(0);
          asset.fill(color);

          // this enemy is already in groupoEnemigos so don't add it
          // Don't add it again in creaEnemigos
          return(asset);
      }
    }

    // no available inactive enemy so create a new enemy
    var enemy = new Kinetic.Rect({
        width: 100,
        height: 50,
        x: x,
        y:0,
        fill: color    
      });

    // this enemy is not in groupoEnemigos so add it
    grupoEnemigos.add(enemy);
    return enemy
}