【问题标题】:Html 5 Grid Drawing ProblemHtml 5 网格绘图问题
【发布时间】:2011-09-04 19:54:46
【问题描述】:
    //Set the number of rows and columns for the board
var rows = 10;
var columns = 10;
var offset= 0.5;

//Create the board, setting random squares to be obstacles
        var board = [];

for (var x = 0; x < columns; x++)
        {
            board[x] = [];

            for (var y = 0; y < rows; y++)
            {
                    board[x][y] = 0;
            }
        }

function draw_grid(size, amount, ctx){
    ctx.strokeStyle = "#FFF";
    for (var i=0.5; i<size*amount+1; i+=size){
        ctx.moveTo(0,i);
        ctx.lineTo(size*amount, i);
        ctx.moveTo(i,0);
        ctx.lineTo(i, size*amount);
        ctx.stroke();
    }
}

function update_grid(grid, ctx){
    ctx.fillStyle = "#000";
    for (var i=0; i<grid.length; i+=1){
        for (var a=0; a<grid[i].length; a+=1){
            if (grid[i][a]==1){
                ctx.fillRect((i*32)+offset, (a*32)+offset, 32, 32);
            }
        }
    }
}

game_area = document.getElementById("a");
context = game_area.getContext('2d');
board[0][3] = 1;

function on_enter_frame(){

    context.clearRect(0,0, game_area.width, game_area.height);
    context.fillStyle = "#28F";
    context.fillRect(0,0,500,500);
    draw_grid(32, 10, context);
    update_grid(board, context);

}

setInterval(on_enter_frame,30);

这段代码似乎占用了很多内存,有人知道为什么吗?刚开始用html5编程...我相信它与update_grid函数中的for循环有关,帮助理解

【问题讨论】:

  • 既然你把它标记为lag,你的意思是它很慢还是真的很占内存?
  • "programming in html5" 你在ECMAScript 中编程,HTML5 是 DOM 的规范,它是被操纵的……
  • 滞后,因为这会占用太多内存并最终导致 Firefox 崩溃......

标签: javascript html memory-leaks setinterval html5-canvas


【解决方案1】:

只是一个建议,您正在循环中进行大量计算,并且您的 setInterval 周期非常短 - 您需要如此频繁地更新您的网格吗?

在您的 draw_grid() 函数中,您计算​​ size*amount 3 次,为什么不在循环外部将其作为局部变量执行一次,然后在您需要的地方重用该变量?

另一种绘画方式可能是使用mozRequestAnimationFrame,如果您需要如此频繁地绘画,它可能会更有效。

【讨论】:

  • 谢谢,通过降低 fps 和创建背景画布解决
【解决方案2】:
game_area = document.getElementById("a");
context = game_area.getContext('2d');

这两个变量都是在没有使用 var 关键字的情况下声明的……这样做很危险,并且可能会导致内存泄漏,具体取决于您使用它们的方式。

这是前进的方向:

var game_area = document.getElementById("a");
var context = game_area.getContext('2d');

此外,最好不要访问全局变量,因为 JavaScript VM 必须进行非常昂贵的查找。更好的方法是这样做:

function on_enter_frame(pContext, pGame_area, pBoard){

    pContext.clearRect(0,0, pGame_area.width, pGame_area.height);
    pContext.fillStyle = "#28F";
    pContext.fillRect(0,0,500,500);
    draw_grid(32, 10, pContext);
    update_grid(pBoard, pContext);

}

然后使用当前作用域中已经存在的所需参数调用该方法:

on_enter_frame(context, game_area, board);

【讨论】:

  • 由于某种原因,这种格式:setInterval(on_enter_frame(context, game_area, board),30) 不起作用。你能告诉我为什么会这样吗?
  • setInterval(on_enter_frame(context, game_area, board),30) 将不起作用,因为不是要求 setInterval 每 30 毫秒使用这些参数调用该方法,而是有效地要求它: 1:调用on_enter_frame(context, game_area, board) 2: setInterval 调用 on_enter_frame(context, game_area, board) 的结果 - 这不是一个函数 setInterval 的正确用法是传递一个函数而不是函数调用的结果。跨度>
猜你喜欢
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多