Animation and game tips.
Avoid saving recovery
setTransform, .
, , GPU && & 2D . / , , /, ( ), , .
- , . (60-), FX , , .
, 2D. , .
ctx.setTransform, ctx.transform
, , , , , , .
, setTransform, . , , .
ctx.setTransform(scaleX,0,0,scaleY,posX,posY); // scale and translate in one call
, javascript x, y ( 4 setTransform) , .
. , x y, , , ,
function drawSprite(image, spriteInd, x, y, cx, cy, sx, sy, r, a){
var spr = image.sprites[spriteInd];
var w = spr.w;
var h = spr.h;
ctx.setTransform(sx,0,0,sy,x,y);
ctx.rotate(r);
ctx.globalAlpha = a;
ctx.drawImage(image,spr.x,spr.y,w,h,-cx,-cy,w,h);
}
1000 + . Firefox ( ) 2000+ ( - 1024 2048). 256 * 256
15 , , , . (.. ),
function drawSprite(image, spriteInd, x, y, a){
var spr = image.sprites[spriteInd];
var w = spr.w;
var h = spr.h;
ctx.setTransform(1,0,0,1,x,y);
ctx.globalAlpha = a;
ctx.drawImage(image,spr.x,spr.y,w,h,0,0,w,h);
}
, , ..
function drawSprite(image, spriteInd, x, y,s,r,a){
var spr = image.sprites[spriteInd];
var w = spr.w;
var h = spr.h;
ctx.setTransform(s,0,0,s,x,y);
ctx.rotate(r);
ctx.globalAlpha = a;
ctx.drawImage(image,spr.x,spr.y,w,h,-w/2,-h/2,w,h);
}
function drawSprite(image){
var s = Math.max(image.width / canvasWidth, image.height / canvasHeight);
ctx.setTransform(s,0,0,s,0,0);
ctx.globalAlpha = 1;
ctx.drawImage(image,0,0);
}
, . ( )
function drawGlobalSprite(image, spriteInd, x, y, cx, cy, sx, sy, r, a){
var spr = image.sprites[spriteInd];
var w = spr.w;
var h = spr.h;
ctx.setTransform(m1,m2,m3,m4,m5,m6);
ctx.transform(sx,0,0,sy,x,y);
ctx.rotate(r);
ctx.globalAlpha = a * globalAlpha; (a real global alpha)
ctx.drawImage(image,spr.x,spr.y,w,h,-cx,-cy,w,h);
}
, .
- ( ), , fill, stroke, filltext, arc, rect, moveTo, lineTo, . , , .
GPU
. 2. (2,4,8,16,32,64,128....), . .. 1024 512 2048 128, .
, 2D- , , , . , 300 300, , , , 512 512. , 2,5 , , . , , , .
, , RAM, , , ( ).
GC
- , GC ( ) . ( , ), ( ), . , (, ). , , , , , .
, , , 1000- ZERO GC. ( , ).
GC 5% , , .