2012-09-07 117 views
2

嘿傢伙不完全確定我做錯了什麼。我玩過幾款HTML5遊戲,而且他們似乎也遇到了不同的問題。圖畫滯後於運動,看起來很奇怪。這似乎並非如此。Laggy運動與帆布遊戲

在我的遊戲中,繪畫看起來不錯,但是在他移動時它每秒都落後(移動是方向鍵)。它也沒有箭頭鍵,如果我讓他自動移動,所以我不認爲這是一個關鍵的檢測問題。

這幾乎就好像垃圾收集器每秒都在運行一樣。儘管如此,我並不認爲我會噴出許多物體。

我使用的是Chrome瀏覽器21(MacOSX的),也火狐14

http://tempdrew.dreamhosters.com/spine/

這裏是JS撥弄相關的代碼。

http://jsfiddle.net/ju3ag/

這是在Chrome金絲雀罰款。我不知道這是不是因爲javascript在標準鉻合金中的速度非常快。這在最新的Firefox中很糟糕。我不確定我做錯了什麼。我正在根據時間更新運動。如果我把它拿出來,儘管它仍然不好。

我只是想知道是否有什麼會突出給任何人。謝謝你的幫助。

sg = Class.extend({ 


}); 

sg.entities = []; 
sg.buttonStates = []; 

sg.createEntity = function (entity) {  
    this.entities.push(entity);  
}; 


window.requestAnimFrame = (function() { 
    return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || 
    function (callback, element) { 
     window.setTimeout(callback, 1000/60); 
    }; 

})(); 


(function defineUtil() { 

    sg.util = {}; 

    sg.util.getRandomInt = function getRandomInt(min, max) { 
     return Math.floor(Math.random() * (max - min + 1)) + min; 
    }; 

    sg.util.getRandomNumber = function getRandomNumber(min, max) { 
     return Math.random() * (max - min) + min; 
    }; 

})(); 


/*************************/ 
(function createEntity() { 

    var Entity = Class.extend({ 

     init: function (x, y) { 

      this.name = 'Entity'; 
      this.health = 100; 

      this.pos = { 
       x: x, 
       y: y 
      }; 

      this.vel = { 
       x: 0, 
       y: 0 
      }; 

      this.accel = { 
       x: 0, 
       y: 0 
      } 

      console.log(this.name + ' created ' + x + ' ' + y); 
     }, 

     update: function (elapsed) { 

     }, 

     draw: function (ctx) { 

     } 

    }); 

    sg.Entity = Entity; 

})(); 





/************************/ 

// -- player.js 
(function createPlayer() { 

    var Player = sg.Entity.extend({ 

     x: 0, 
     y: 0, 
     moveLeft: false, 
     moveRight: false, 
     speed : 5, 

     init: function (x, y) { 

      this.x = x; 
      this.y = y; 
      this.name = 'Player'; 
     }, 

     draw: function (ctx) { 

      var x = this.x, 
       y = this.y; 

      ctx.beginPath(); 
      ctx.rect(x, y, 40, 50); 
      ctx.fillStyle = 'white'; 
      ctx.fill(); 
      ctx.lineWidth = .5; 
      ctx.strokeStyle = 'rgba(0,0,0,.3)'; 
      ctx.stroke(); 
      ctx.fillStyle = 'rgba(0,0,0,.5)'; 
      ctx.fillRect(x + 25, y + 15, 5, 5); 
     }, 

     update: function (elapsed) { 
      var distance = (60/1000) * elapsed; 
      if (this.moveLeft) { 
       this.x += this.speed * distance; 
      } else if (this.moveRight) { 
       this.x -= this.speed * distance; 
      } 
     }, 

     keyDown: function (e) { 

      if (e.keyCode === 39) { 
       this.moveLeft = true; 
      } else if (e.keyCode === 37) { 
       this.moveRight = true; 
      } else { 
       this.moveLeft = false; 
       this.moveRight = false; 
      } 
     }, 

     keyUp: function (e) { 

      if (e.keyCode === 39) { 
       this.moveLeft = false; 
      } else if (e.keyCode === 37) { 
       this.moveRight = false; 
      } 
     } 

    }); 


    sg.Player = Player; 

})(); 




/**********************************/ 


(function createGame() { 

    var Game = Class.extend({ 

     canvas: null, 
     context: null, 
     width: null, 
     height: null, 

     init: function (width, height) { 

      this.canvas = document.getElementById('canvas'); 
      this.context = this.canvas.getContext('2d'); 

      this.width = width || 800; 
      this.height = height || 600; 

      this.canvas.width = this.width; 
      this.canvas.height = this.height; 
     }, 

     clear: function() { 
      this.context.clearRect(0, 0, this.width, this.height); 
     }, 

     draw: function() { 

      this.clear();  

      for (var i = 0; i < sg.entities.length; i++) { 
       sg.entities[i].draw(this.context); 
      } 
     }, 

     update: function (elapsed) { 

      for (var i = 0; i < sg.entities.length; i++) { 
       sg.entities[i].update(elapsed); 
      } 
     }, 

     keyDown: function (e) { 

      for (var i = 0; i < sg.entities.length; i++) { 

       if (typeof sg.entities[i].keyDown === 'function') { 
        sg.entities[i].keyDown(e); 
       } 
      } 
     }, 


     keyUp: function (e) { 

      for (var i = 0; i < sg.entities.length; i++) { 
       if (typeof sg.entities[i].keyUp === 'function') { 
        sg.entities[i].keyUp(e); 
       } 
      } 
     } 

    }); 

    sg.Game = Game; 

    var game = sg.currentGame = new sg.Game(800, 600); 


    var player = new sg.Player(200, 459); 

    sg.createEntity(player); 

    function update(elapsed) { 

     game.update(elapsed); 
    } 

    var lastUpdate = Date.now(); 

    function draw() { 

     var now = Date.now(); 
     var elapsed = (now - lastUpdate); 
     lastUpdate = now; 

     game.draw(); 
     update(elapsed); 
     requestAnimFrame(draw); 
    } 

    window.addEventListener('keydown', sg.currentGame.keyDown, false); 
    window.addEventListener('keyup', sg.currentGame.keyUp, false); 

    draw(); 

})(); 
+1

您是否嘗試過在Chrome調試工具剖析內存?我想一個失控的內存泄漏可能比你需要更頻繁地觸發GC。 –

+0

剛剛添加的是,它在最新的Chrome和Firefox(Windows 7)上對我來說絕對正常運行 –

+0

前幾天我做了一個CPU配置文件,但沒有什麼突出的。內存配置文件也不突出。這是我在任何其他帆布遊戲中看到的典型特徵。記憶力上升,然後GC命中。從我所看到的GC來看,每隔30秒左右就會有一次。至少有一個大的GC命中。我只是想知道,如果你不注意,因爲Windows上的GPU加速畫布。我不認爲目前的Chrome瀏覽器具有MacOSX的功能。也許加那利呢。 –

回答

0

keydown/keyup事件正在一個和另一個press之間等待一小段時間。

這是我如何解決我的情況(不知道這是你的問題);每隔20ms增加一個setInterval檢查是否存在關鍵點(對角線運動不止一個)。

​​

希望幫助:)

+0

有關關鍵事件延誤的有趣理論......但我看不出這將如何解決它? –

+0

是的。感謝您的幫助,但是如果沒有按鍵,移動也會出現問題。 –

+0

對不起我的錯,我讀得太快了:) – ianaz