我遇到了以下问题,我相信我一定做错了什么事,但是我找不到原因。(这是在Firefox 8中)
我有一个大雪碧图文件,我创建了一个新的小画布来存放其中的一个瓷砖,并使用drawImage
的最基本重载将此隔离的瓷砖绘制在我的“屏幕”画布的数百个位置。
我这样做是为了避免使用drawImage
的最后重载,该重载仅使用较大的精灵文件的一部分。在Chrome中,通过避免这种剪切,我惊讶地获得了约10%的性能提升。然而,在Firefox中,帧速率从300下降到17 FPS。
因此,我看到的实质上是,在Firefox中,“从图像绘制到画布”的速度比“从画布绘制到画布”快了约20倍。
这正确吗?我没有在这个特殊情况下找到任何信息,但这是我测试时看到的结果。
这是我正在使用的代码。我有什么特别愚蠢的行为吗?
function Test5() {
var imgSprite = $('imgSprite');
var tileCanvas = document.createElement("canvas");
tileCanvas.width = 64; tileCanvas.height = 31;
var tileCtx = tileCanvas.getContext("2d");
tileCtx.drawImage(imgSprite, 0, 0, 64, 31, 0, 0, 64, 31);
//--------------------------------------
var ctx = getContext('mainScreen');
ctx.fillStyle = '#fff';
time(function() { // time will run this function many times and time it
ctx.fillRect(0,0, 1200,900);
var x=0, y=0, row = 0;
for (var i=1; i < 1000; i++) {
ctx.drawImage(tileCanvas, x,y); // <-- this is the line I care about
// some simple code to calculate new x/y
}
}, 1000, "Test5", 'Drawing from an individual tile canvas, instead of a section of big sprite');
}
如果不是使用
ctx.drawImage(tileCanvas, x,y);
I do :
ctx.drawImage(imgSprite, 0, 0, 64, 31, x, y, 64, 31);
那就快20倍速度更快了。
我有什么遗漏吗?
编辑: 在提出这个问题后,我为自己制作了一个小页面,以测试不同平台上的几种不同的东西,并查看每种方式在每种情况下的最佳方式。
http://www.crystalgears.com/isoengine/jstests3-canvas.html
很抱歉,那段代码非常丑陋,只是一个快速的hack,不应该被其他人甚至是我自己在几天后看到。
time()
的结果和代码,这样我们就可以玩了吗? - Hogan