[Canvas] Animation

Chenยท2024๋…„ 5์›” 29์ผ
0

Canvas

๋ชฉ๋ก ๋ณด๊ธฐ
3/11
post-thumbnail

JS์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ CSS ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๋‹ค๋ฅด๋‹ค
CSS๋Š” keyframes๋กœ ์ž๋™์ ์œผ๋กœ ์›€์ง์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
JS๋Š” ๋ฐ˜๋ณต์ ์ธ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ขŒํ‘œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„

์ฆ‰, JS ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ = ์ž๋™์ ์œผ๋กœ ๊ณ„์‚ฐ์„ ํ•ด์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ

requestAnimationFrame()

๊ฐœ๋… : ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์• ๋‹ˆ๋ฉ”

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ทธ๋ ค๋‚ผ ๋•Œ, reflow ๊ณผ์ • ํ›„ => repaint

reflow = ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •
repaint = ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒ‰์„ ์น ํ•˜๋Š” ์ž‘์—…

repaint๊ฐ€ ๋˜์–ด์•ผ ๋ˆˆ์— ๋ณด์ž„, ์น ํ•˜๊ธฐ ์ „์— ์น ํ•  ์ค€๋น„๋๋Š”์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•จ์ˆ˜

= ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฌด๊ฑฐ์šด๋ฐ paint๊ฐ€ ์ง„ํ–‰๋˜๋ฉด ํ”„๋ ˆ์ž„์ด ์œ ์‹ค๋˜๊ฑฐ๋‚˜, ๋ฒ„๋ฒ…์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๋ฆฌ๊ธฐ ์ตœ์ ํ™”๋œ ์ƒํƒœ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•จ์ˆ˜ (=> ์ธ์œ„์ ์œผ๋กœ ๋ฐ˜๋ณต์‹œํ‚ด)

function draw(){
	context.arc(10, 150, 10, 0, Math.PI * 2);     	
  	context.fill();
      
	requestAnimationFrame(draw);
  	console.log("drawing...");
}
      
draw();

์—ฌ๊ธฐ์„œ๋„ ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ์“ฐ์ด๋„ค!! Interesting!
์ด์ œ ํ•ด์ค„ ๊ฑด, ์ขŒํ‘œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ

setInterval()์™€ ๋น„๊ต

// setInterval์˜ ๊ฒฝ์šฐ

function draw(){
        context.clearRect(0, 0, canvas.width, canvas.height);
context.beginPath();
context.arc(xPos, 150, 10, 0, Math.PI * 2);
context.fill();
xPos += 10;

//requestAnimationFrame(draw);
}
      
setInterval(draw, 100);

์†๋„ ์ปจํŠธ๋กค์ด ์‰ฌ์›€. ์ฆ๊ฐ€๋Ÿ‰๊ณผ ์†๋„๋งŒ ์ปจํŠธ๋กคํ•˜๋ฉด ์›ํ•˜๋Š” ๋А๋‚Œ์˜ ๋น ๋ฅด๊ธฐ ์กฐ์ ˆ ๊ฐ€๋Šฅ

BUT requestionAnimationFrame()๊ณผ ๋‹ฌ๋ฆฌ '๋ฌด๋Œ€๋ฝ€ ๊ทธ๋ฆฌ๊ธฐ'๋ผ์„œ ๋””๋ฐ”์ด์Šค ์„ฑ๋Šฅ์ด ์•ˆ ์ข‹์œผ๋ฉด ํ”„๋ ˆ์ž„ ์œ ์‹ค ๋ฐ ๋š๋š ๋Š๊น€ ํ˜„์ƒ ๋ฐœ์ƒ...

๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ๋ฐฐํ„ฐ๋ฆฌ ์ ˆ์•ฝ์—๋„ requestAnimationFrame()์ด ์ข‹๋‹ค๊ณ  ํ•จ

๋ฌผ๋ก , setInterval ์ธํ„ฐ๋ฒŒ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค๋Š” ๊ฑด ๋งž์Œ


setInterval ์—†์ด ์ธํ„ฐ๋ฒŒ ํƒ€์ด๋ฐ ์กฐ์ ˆ

์ดˆ๋‹น 60ํšŒ ๋ฐ˜๋ณต์„ ๋ชฉํ‘œ๋กœ ํ•˜๋ฏ€๋กœ ์–ผ์ถ” 0.5์ดˆ ์ธํ„ฐ๋ฒŒ

function draw(){
        
        if(count % 30 === 0){
          context.clearRect(0, 0, canvas.width, canvas.height);
          context.beginPath();
          context.arc(xPos, 150, 10, 0, Math.PI * 2);
          context.fill();
          xPos += 5;
        }  
          count++;
          requestAnimationFrame(draw);
      }
      
      draw();

์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฉˆ์ถ”๊ธฐ

๋ฐฉ๋ฒ• 1

if (xPos >= canvas.width-10) {
	return;
}

๋ฐฉ๋ฒ• 2

timerId = requestAnimationFrame(draw);

	if (xPos >= canvas.width-10) {
    cancelAnimationFrame(timerId);
}

๋ฐฉ๋ฒ• 3 (ํด๋ฆญ ์ทจ์†Œ)

// requestAnimationFrame()
canvas.addEventListener('click', () => {
	cancelAnimationFrame(timerId);
});
// setInterval
canvas.addEventListener('click', () => {
	clearInterval(timerId);
});

profile
ํ˜„์‹ค์ ์ธ ๋ชฝ์ƒ๊ฐ€

0๊ฐœ์˜ ๋Œ“๊ธ€