Javascript 当我创建许多对象时,kineticjs会变慢

Javascript 当我创建许多对象时,kineticjs会变慢,javascript,performance,kineticjs,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 ohe

我在使用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();
}
var framesSegundo=1000/20//1000秒20帧
var阶段,fondo;
个人价值;
var-intv;
//计算一个敌人和另一个敌人之间的时间
var SegEneCreado=0;
var layer=新的动能层();
//与chrachters集团
var grupoppersonajes=新的动力学群({});
var grupoEnemigos=新的动力学群({});
//屏幕创建
var阶段=新的动力学阶段({
容器:“游戏”,
宽度:960,
身高:640
});
//级别创建
函数creaNivel(){
//个人奶油
personaje=新的动能.Rect({
宽度:100,
身高:50,
x:10,
y:stage.getHeight()/2,
填充:“红色”
});
grupoPersonajes.add(personaje);
layer.add(grupoppersonajes);
阶段。添加(层);
}
//制造敌人
函数creaEnemigos(){
//我们留下了一秒钟的时间来制造另一个敌人
if(SegEneCreado 970){
SegEneCreado=框架结构;
//制造敌人
var tipoEnemigo=parseInt(aleatorio(0,3));
如果(tipoEnemigo==0){
var enemigo=create敌军(stage.getWidth()+10,0,'green');
}
否则如果(tipoEnemigo==1){
var enemigo=create敌军(stage.getWidth()+10,0,'blue');
}
否则如果(tipoEnemigo==2){
var enemigo=create敌军(stage.getWidth()+10,0,'yellow');
}
否则{
var enemigo=create敌军(stage.getWidth()+10,0,'C48BD9');
}
setY(aleatorio(0,stage.getHeight()-enemigo.getHeight());
grupoEnemigos.add(enemigo);
添加图层(grupoEnemigos);
阶段。添加(层);
}
}
否则{
SegEneCreado——;
}
}
函数MoverEnemigos(){
对于(我在grupoEnemigos.儿童中){
var资产=grupoEnemigos.children[i];
资产变动(-5,0);

如果(asset.getX()+asset.getWidth()
asset.remove
将使敌人离开画布,但不会摧毁敌人的物体

使用
asset.destroy
移除敌人对象使用的资源

更有效的方法是“回收”你的敌人,而不是重新创建一个新的敌人:

当敌人离开舞台时,将其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
}