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์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก๋ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์๋ํ๋ฉด :
๋ฉ์ง ์น ๊ธฐ๋ฅ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ฌ์ฉํ ์ ์์ ๋ ์ฌ์ฉํ ์์๋ ๊ธฐ๋ฅ์ผ๋ก ๋์ฒดํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์๋ง๋์ด ์์ง๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
์ฌ์ค์ 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์
๋๋ค).
์์ ๋ฅผ ์๊ณ ์๋ค๋ฉด ์๊ฒฌ์์ ๊ทธ ์ฅ์ ์ค ์ผ๋ถ๋ฅผ ์์ ๋กญ๊ฒ ๋งํฌํ์ญ์์ค.