2013-10-13 45 views
-1

我有我的游戏一个问题,即它开始快速并在它的几秒钟速度明显慢了下来后,我已经采取了的码位和一个补充他们在时间看看是什么让它放慢速度,这是当我创建块数组并将它们打印到导致延迟的屏幕上时。游戏放缓,成为无法播放

//座部

-loop从1至10 - 创建形状对象 通过阵列 -Paint形状-push上阵列 末端

-loop筛选

有是游戏中的很多bug,它仍然在完成:) :)

http://jsfiddle.net/s2NCx/1/

var canvas; 
var ctx; 
var dx = 5; 
var dy = 5; 
var x = 460; 
var y = 480; 
var a = 500; 
var b = 570; 
var WIDTH = 1000; 
var HEIGHT = 600; 
var x1 = 0, 
    y1 = 0; 
var dx1 = 5, 
    dy1 = 5; 
var myblocks = []; 
ball = new setcircle(x, y, 10, "purple"); 
//paddel = new square(x,y,100,20,"purple"); 

//initate 
function init() { 
    canvas = document.getElementById("canvas"); 
    ctx = canvas.getContext("2d"); 
    return setInterval(draw, 10); 

} 

//creates an array of blocks and prints to screen 
function block() { 


    var p = 40; 
    for (var i = 0; i < 10; i++) { 

     myblocks.push(new Shape(p, 10, 90, 20, "#333")) 
     p = p + 91; 
    } 

    for (i in myblocks) { 
     oblock = myblocks[i]; 
     ctx.fillStyle = oblock.fill1; 
     ctx.fillRect(oblock.a, oblock.b, oblock.w, oblock.h); 

    } 
} 

//draws and moves ball 
function movecircle(ball) { 

    ball.x += dx; 
    ball.y += dy; 
    if (ball.x <= 0) dx = 5; 
    else if (ball.x >= 980) dx = -5; 
    if (ball.y <= 0) dy = 5; 
    else if (ball.y >= 590) dy = -5; 
    ctx.beginPath(); 
    ctx.fillStyle = ball.fill; 
    ctx.arc(ball.x, ball.y, 10, 0, Math.PI * 2, true); 
    ctx.fill(); 



} 

// checks if collides 
function isCollide(r, c) { 

    // copyed from stackoverflow 
    var cx = Math.abs(c.x - r.a - r.w/2); 
    var xDist = r.w/2 + c.r; 
    if (cx > xDist) return false; 
    var cy = Math.abs(c.y - r.b - r.h/2); 
    var yDist = r.h/2 + c.r; 
    if (cy > yDist) return false; 
    if (cx <= r.w/2 || cy <= r.w/2) return true; 
    var xCornerDist = cx - r.w/2; 
    var yCornerDist = cy - r.h/2; 
    var xCornerDistSq = xCornerDist * xCornerDist; 
    var yCornerDistSq = yCornerDist * yCornerDist; 
    var maxCornerDistSq = c.r * c.r; 
    return xCornerDistSq + yCornerDistSq <= maxCornerDistSq; 
} 

//ball object 
function setcircle(x, y, r, fill) { 

    this.x = x; 
    this.y = y; 
    this.r = r; 
    this.fill = fill; 
} 
//shape object 
function Shape(a, b, w, h, fill) { 

    this.a = a; 
    this.b = b; 
    this.w = w; 
    this.h = h; 
    this.fill1 = fill; 

} 
//keyboard inout 
function doKeyDown(evt) { 
    switch (evt.keyCode) { 
     case 38: 
      /* Up arrow was pressed */ 
      if (b - dy > 0) { 
       b -= dy; 
      } 
      break; 
     case 40: 
      /* Down arrow was pressed */ 
      if (b + dy < HEIGHT) { 
       b += dy; 
      } 
      break; 
     case 37: 
      /* Left arrow was pressed */ 
      if (a - dx > 0) { 
       a -= dx; 
      } 
      break; 
     case 39: 
      /* Right arrow was pressed */ 
      if (a + dx < WIDTH) { 
       a += dx; 
      } 
      break; 
    } 
} 

function changedirection(ball) { 
    dy = -dy; 






} 

function update() { 


    //check if ball hits paddle 
    if (isCollide(paddel, ball)) { 
     changedirection(ball); 
     ctx.fillStyle = "purple"; 
     ctx.fillRect(200, 200, 100, 100); 
    } 
    //check if ball hits block 
    for (i in myblocks) { 
     if (isCollide(myblocks[i], ball)) { 
      changedirection(ball); 
      ctx.fillStyle = "purple"; 
      ctx.fillRect(200, 200, 100, 100); 

     } 
    } 

} 



function draw() { 
    ctx.clearRect(0, 0, canvas.width, canvas.height); 
    movecircle(ball); 
    block(); 
    paddel = new Shape(a, b, 100, 20, "purple"); 
    ctx.fillStyle = paddel.fill1; 
    ctx.fillRect(paddel.a, paddel.b, paddel.w, paddel.h); 
    update(); 
} 
init(); 
window.addEventListener('keydown', doKeyDown, true); 

//更新:

我已删除的块的initalisation并放入init方法并且这具有显著加快游戏。

+1

第一步就是要发布的内容你已经尝试(分析?删除代码?搜索的优化?) – Dave

回答

4

运行您的代码并使用内置的镶边器显示您的应用程序在block函数中花费的时间超过了50%。

enter image description here

综观一段时间之后拍摄的快照堆显示,大量堆空间被Shape对象所占用。

enter image description here

综观block源,我们看到你推每次block被称为10个新Shape对象。这就是为什么你的应用程序正在放缓。您应该查看这些分析工具,因为这是了解应用程序中哪些瓶颈存在的好方法。

对于一个简单的方法,至少使应用程序不会那么快,你可以添加减缓:

myblocks = []; 
block功能的开头

+0

干杯,从来没有新的有这样的应用程序,它会帮助很多在未来! – Bawn

2

myblocks的大小在block()的基础上增加10个,每10毫秒调整一次(您的setInterval),增加draw()。一秒钟后,你有1000块。

2

放缓是事实,你再呼叫

block(); 
paddel = new Shape(a, b, 100, 20, "purple"); 

(即重新桨状,板块)在平局的每次迭代(引起的),叫每10毫秒