Using requestAnimationFrame - Lee-hyuna/33-js-concepts-kr GitHub Wiki

์ด์ „์—๋Š” JavaScript์—์„œ time loop๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. setInterval().
๊ฝค ๋น ๋ฅธ ๊ฒƒ์„ ๋ฐ˜๋ณต ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด (for ๋ฃจํ”„์ฒ˜๋Ÿผ ๋น ๋ฅด์ง€๋Š” ์•Š์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ) ๋ฐ˜๋ณต ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋ชฉ์  ์ƒ, ๋งค์ดˆ 60 ๊ฐœ์˜ "ํ”„๋ ˆ์ž„"์ด ๋งค๋„๋Ÿฝ๊ฒŒ ๋‚˜ํƒ€๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

setInterval(function() {
  // animiate something
}, 1000/60);

์ง€๊ธˆ ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Paul Irish๋Š” 2 ๋…„ ์ „์— requestAnimationFrame์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋”ํ•  ํ•„์š”๊ฐ€ ๋ณ„๋กœ ์—†์œผ๋ฉฐ, ์‹ค์ œ๋กœ ์‚ฌ์šฉ ํ•ด๋ณด์ง€ ๋ชปํ–ˆ๊ณ , ์ด์ œ๋Š” ๋‹จ์–ด๋ฅผ ์ „ํŒŒํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์“ฐ๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ์ด์œ ?

Paul ์„ค๋ช… :

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • ๋น„ํ™œ์„ฑ ํƒญ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ค‘์ง€๋˜์–ด CPU๊ฐ€ ์ฐจ๊ฐ€์›Œ์ง„๋‹ค.
  • ๋”์šฑ ๋ฐฐํ„ฐ๋ฆฌ ์นœํ™”์ ์ด๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฐ€๋Šฅํ•œ ์˜ˆ์‹œ

function repeatOften() {
  // Do whatever
  requestAnimationFrame(repeatOften);
}
requestAnimationFrame(repeatOften);

ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜์—ฌ ํ‚ฅ์˜คํ”„ํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ์žฌ๊ท€์ ์œผ๋กœ ์ž์‹ ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ ๋ฐ ์ค‘์ง€

requestAnimationFrame์€ setTimeout ๋˜๋Š” setInterval๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ทจ์†Œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
jQuery๋Š” ์—ฌ๊ธฐ์—์„œ ๊ฐ„๋‹จํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ ์ด๋ฒคํŠธ ๋ฐ”์ธ๋”ฉ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

var globalID;

function repeatOften() {
  $("<div />").appendTo("body");
  globalID = requestAnimationFrame(repeatOften);
}

$("#start").on("click", function() {
  globalID = requestAnimationFrame(repeatOften);
});

$("#stop").on("click", function() {
  cancelAnimationFrame(globalID);
});

๋ธŒ๋ผ์šฐ์ € ์ง€์›

์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์œ ์ผํ•œ ์ฃผ๋ชฉํ• ๋งŒํ•œ ๋ฌธ์ œ๋Š” IE 9, iOS 5 ๋ฐ Android์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด :

Polyfill

๋ฉ‹์ง„ ์›น ๊ธฐ๋Šฅ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์›น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
์•„๋งˆ๋„์ด ์š”์ง€๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.
์‚ฌ์‹ค์ƒ requestAnimationFrame ๋˜๋Š” cancelAnimationFrame์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๊ทธ ์ฒญํฌ๋ฅผ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ํฌํ•จ ์‹œํ‚ค์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ requestAnimationFrame์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ฝ๊ฐ„ ๋ณต์žกํ•œ ์˜ˆ์ œ

var globalID;

function repeatOften() {
  $("<div />").appendTo("body");
  globalID = requestAnimationFrame(repeatOften);
}

  globalID = requestAnimationFrame(repeatOften);

$("#stop").on("click", function() {
  cancelAnimationFrame(globalID);
});
$("#start").on("click", function() {
  globalID = requestAnimationFrame(repeatOften);
});

์‚ฌ์‹ค ๋” ๋ณต์žกํ•œ ๊ฒƒ์€ ์—ฌ๋Ÿฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋™์‹œ์— ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ OK์ž…๋‹ˆ๋‹ค).
์˜ˆ์ œ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์˜๊ฒฌ์—์„œ ๊ทธ ์žฅ์  ์ค‘ ์ผ๋ถ€๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋งํฌํ•˜์‹ญ์‹œ์˜ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ