π μΉ μ λλ©μ΄μ μ΅μ ν requestAnimationFrame κ°μ΄λ
μλ°μ€ν¬λ¦½νΈ μΉ μ λλ©μ΄μ
μΉνμ΄μ§μ μ λλ©μ΄μ
μ ꡬνν λ CSSμ animatoin , transition , transform μμ±μ ν΅ν΄ ꡬνν μλ μμ§λ§, λ³΄λ€ μ¬μ©μμμ 볡μ‘ν μνΈμμ©μ ꡬννκ² νκΈ° μν΄ Javascriptμ ν¨κ» μ¬μ©νμ¬ μ€νμΌμ λ³νμν€λ νλ€. μλ₯Όλ€μ΄ νΉμ μμμ ν΄λ¦νκ±°λ μΉνμ΄μ§λ₯Ό μ€ν¬λ‘€ν λ λ³ν무μν μ λλ©μ΄μ
μμ
λ€μ΄ κ·Έλ¬νλ€.
κ·Έλμ κ°λ¨νκ³ κ·μΉμ μΈ μ λλ©μ΄μ μ CSSλ‘λ§ μμμ μ’νκ°μ΄λ μ€νμΌ ν¬κΈ°λ₯Ό λ³νμν€κ³ , μΈλ°ν μ‘°μμ΄ νμν μ λλ©μ΄μ μ μλ°μ€ν¬λ¦½νΈλ‘ μ€νμΌ μμ±μ λ³κ²½ μν€λ νΈμ΄λ€. νμ§λ§ μλ°μ€ν¬λ¦½νΈλ‘ μ€νμΌ μμ±μ λ³νμν€λ λ°©λ²μ CSSλ³΄λ€ (νΉν λͺ¨λ°μΌμμ) μ±λ₯μ΄ μ’μ§ μλ€. λ°λΌμ μ΄μ©μ μμ΄ μλ°μ€ν¬λ¦½νΈμμ μνΈ νλ ₯μ΄ νμν κ²½μ° μ΄λ₯Ό μν μ΅μ ν κΈ°λ²μ΄ μ‘΄μ¬νλ€.
μ΄λ² ν¬μ€ν
μ μ΄λ¬ν μ λλ©μ΄μ
κ΄λ ¨ μ΅μ ν APIμΈ requestAnimationFrame() μ λν μ¬μ©λ²κ³Ό μ리λ₯Ό μκ°ν΄λ³΄λ μκ°μ κ°μ Έ λ³΄κ² λ€. λΈλΌμ°μ λΌλ μννΈμ¨μ΄λ₯Ό μ λ¬Έμ μΌλ‘ λ€λ£¨λ νλ‘ νΈμλ κ°λ°μμΌ κ²½μ° μ΄μ κ΄ν μ§μμ κ±°μ νμλΌκ³ λ³Ό μ μλ€.
λΈλΌμ°μ λ λλ§ λ¨κ³
λΈλΌμ°μ κ° νλ©΄μ 무μΈκ°λ₯Ό 그리기κΉμ§λ μλ μ¬μ§κ³Ό κ°μ΄ κ² 3 λ¨κ³λ‘ λλ μ μλ€.
- Javascript - μ λλ©μ΄μ λ° κΈ°ν μμ μ€ν¬λ¦½νΈλ₯Ό μν (DOM μμ±)
- Style - CSS κ·μΉμ μ΄λ€ μμμ μ μ©ν μ§ κ³μ°νλ νλ‘μΈμ€ (CSSOM μμ±)
- Layout - λΈλΌμ°μ λ DOMκ³Ό CSSOMμ κ²°ν©νμ¬ κ°μ²΄λ€μ μμΉμ ν¬κΈ° λ±μ κ³μ°νλ λ λ νΈλ¦¬(Render Tree)λ₯Ό μμ±.
- Paint(redraw) - λΈλΌμ°μ λ λ λ νΈλ¦¬λ₯Ό μ¬μ©νμ¬ μ€μ λ‘ νλ©΄μ ν½μ μ μΆλ ₯ (κ°μ²΄κ° μ€μ νλ©΄μ κ·Έλ €μ§λ κ²μ μλ―Έ)
- Composite - λΈλΌμ°μ λ νλ©΄μ μΆλ ₯λλ κ°μ²΄λ€μ ν©μ±νμ¬ μ΅μ’ νλ©΄μ μμ±
νμ¬λ μ λ¨κ³ νλνλλ₯Ό μ¬κΈ°μλ μμΈν μμλ³Ό νμλ μκ³ , μλ°μ€ν¬λ¦½νΈλ‘ μ리먼νΈλ₯Ό 무μΈκ° λ³νλ₯Ό μ€λ€λ©΄ μ½λλ₯Ό μ€ννκ³ λ~ μ΄ μλλΌ, μμ κ°μ 볡μ‘ν λλλ§ νμ΄νλΌμΈ λ¨κ³λ₯Ό μ§λ νλ©΄μ κ·Έλ¦°λ€λ μ λλ‘λ§ μκ³ μμΌλ©΄ λλ€.
λΈλΌμ°μ νλ μ
κ²μ λͺ¨λν°λ₯Ό κ³ λ₯΄λ€λ³΄λ©΄ 60hz, 120hz λΌκ³ λͺ¨λν° μ£Όμ¬μ¨μ λ€μ΄λ³Έ μ μ΄ μμ κ²μ΄λ€. μ΄λ 1μ΄λμ λͺ¨λν° νλ©΄μ μΆλ ₯ λΉλλ₯Ό λνλ΄λ λ¨μ μ΄λ€. κ·Έλ¦¬κ³ λ³΄ν΅ hzλ frameκ³Ό κ΄λ ¨μ΄ μλ€.
μ°λ¦¬κ° μνλ μ λλ©μ΄μ μ 보λ κ²μ μ¬μ€ 짧μ μκ° κ°κ²©μ μ΄μ΄μ§λ μ₯λ©΄μ 보λ κ²μ΄λ€. μ΄ κ°κ°μ μ₯λ©΄μ frameμ΄λΌκ³ νλ€. μ¦, νλ μμ ν μ₯μ μ¬μ§μ΄λΌ λ΄λ 무방νλ€. κ·Έλ¦¬κ³ νΉμ μκ° λ΄μ 보μ¬μ§λ frame κ°―μλ₯Ό frame rate νΉμ frame per second μ€μ¬μ fpsλΌκ³ νλ€. (κ²μμ ν΄λ³΄λ©΄ κ°μ₯ μμ£Ό λ£λ λ¨μμΌ κ²μ΄λ€)
λ³΄ν΅ μΈκ°μ λμ 1μ΄μ 60λ² μ₯λ©΄μ΄ λμ΄κ°μΌ λΆλλ½λ€κ³ λλλ€κ³ νλ€. κ·Έλμ νλ κΈ°κΈ°λ€μ μκ°μ μΈ ν¨κ³Όλ₯Ό μν΄ μ΄λΉ 60λ² νλ©΄μ λ€μ 그리λλ‘ κΈ°λ³Έμ μΌλ‘ μ€κ³λλ€. μ΄λ₯Ό 60fps νΉμ 60hz λΌκ³ λΆλ¦¬μ°λ μ΄μ μ΄λ€.
κ΅³μ΄ FPSλ₯Ό μ€λͺ νκ³ HzκΉμ§ μ€λͺ νλ μ΄μ λ μΉ νλ©΄μ λΆλλ¬μ΄ μ λλ©μ΄μ μμ§μ ν¨κ³Όλ₯Ό μ£ΌκΈ° μν΄μ μ΄ νλ μ λ¨μμ λ§κ² μ€κ³ν΄μΌ λκΈ° λλ¬Έμ΄λ€. μ΄λΉ 60κ°μ νλ μμ λ λλ§ νλ€λ λ§μ, 16.666 λ°λ¦¬μΈμ»¨λ(1000ms / 60fps) κ°κ²©μΌλ‘ νλ μ μμ±μ΄ νμν μ μ΄ λλ€. λ°λΌμ μλ°μ€ν¬λ¦½νΈλ‘ μ¬μ©μμκ² λΆλλ¬μ΄ μ λλ©μ΄μ μ ꡬννλ €λ©΄ 16.6msλ°λ¦¬μ΄ λ§λ€ μ½λλ₯Ό νΈμΆνλ μμΌλ‘ ꡬνν΄μΌ νλ€.
νμ΄λ¨Έ ν¨μλ₯Ό μ΄μ©ν μ λλ©μ΄μ μ€ν¬λ¦½ν
λ°λΌμ μλ°μ€ν¬λ¦½νΈλ‘ μΌμ μκ°λ§λ€ μ½λλ₯Ό λ°λ³΅ νΈμΆνλ λνμ μΈ λ°©λ²μΌλ‘λ νμ΄λ¨Έ ν¨μμΈ setInterval() μ setTimeout() μ μ΄μ©ν΄ 60νλ μμ λ§κ² μ€ν¬λ¦½ν
μ νλ€λ©΄ μλ μ½λμ κ°μ΄ ꡬμ±ν μκ° μλ€.
const performAnimation = () => {
/* μ€νμΌ μ‘°μ μ€ν¬λ¦½νΈ */
}
// 1μ΄μ 60λ² λ¬΄ν λ°λ³΅
setInterval(performAnimation, 1000 / 60)
const performAnimation = () => {
/* μ€νμΌ μ‘°μ μ€ν¬λ¦½νΈ */
setTimeout(performAnimation, 1000 / 60); // ν¨μ λ΄λΆμμ λ€μ setTimeoutμ νΈμΆνμ¬ λ°λ³΅
}
setTimeout(performAnimation, 1000 / 60);
νμ΄λ¨Έ ν¨μμ λ¬Έμ μ
κ·Έλ¬λ setInterval() μ setTimeout() μ λ¬Έμ μ μ μ£Όμ΄μ§ μκ°λ΄μ λμμ ν λΏ νλ μμ μ κ²½ μ°μ§ μκ³ λμνλ€λ μ μ΄λ€. νμ΄λ¨Έ ν¨μλ νλ μ λ¨μλ‘ νλ μ μμ μκ°μ λ§μΆ° μ€νλ¨μ 보μ₯νμ§ λͺ»νκΈ° λλ¬Έμ΄λ€.
λ§μΌ μλ κ·Έλ¦Όμ²λΌ μ½ 16ms κ°κ²©μΌλ‘ νλ μ λ¨μκ° μ§νλμ΄μΌ νλλ°, λΈλΌμ°μ κ° λ€λ₯Έ μμ μνμΌλ‘ μΈν΄ μ§μ°λμ΄ μλ°μ€ν¬λ¦½νΈμ μ½λ°± μ½λ λΆλΆμ΄ λ¨μ μ€κ°μμ νΈμΆλμλ€κ³ νμ.
μλ°μ€ν¬λ¦½νΈ μ€νμ μν΄ λ¦¬νλ‘μ°κ° μΌμ΄λ μμμ λ³Έ λΈλΌμ°μ λ λλ§ λ¨κ³μΈ λ μ΄μμ - νμΈνΈ - ν©μ± κ³Όμ μ΄ λ€μ μΌμ΄λκ² λλλ°, κ·Έλ¬λ©΄ νλ μμ΄ μμ±λμ§ λͺ»νκ³ λλ½λμ΄ λ²λ € 1 νλ μμ΄ κΉμ¬λ²λ¦¬λ νμμ΄ λνλκ² λλ€.
μ΄λ¬ν νμμ΄ μΌμ΄λ μ μλ μ΄μ λ μλ°μ€ν¬λ¦½νΈμ μ½ μ€ν(call stack)μ μ±κΈ μ€λ λ μ΄κΈ° λλ¬Έμ΄λ€
νλ μμ΄ κΉμΈλ€λ κ²μ 곧 νλ μ λλμ΄ μΌμ΄λ κ²°κ΅ νλ©΄μ΄ λ²λ² μ΄κ² λλ€. μ΄λ¬ν μ§μ°(delay) λ°μ λ¬Έμ λλ¬Έμ λμμΌλ‘ νμν κ²μ΄ λ°λ‘ rAF(requestAnimationFrame) μ΄λ€.
requestAnimationFrame
requestAnimationFrame ν¨μλ μμ€ν μ΄ νλ μμ 그릴 μ€λΉκ° λλ©΄ μ λλ©μ΄μ νλ μμ νΈμΆνμ¬ μ λλ©μ΄μ μΉνμ΄μ§λ₯Ό λ³΄λ€ μννκ³ ν¨μ¨μ μΌλ‘ μμ±ν μ μλλ‘ ν΄μ€λ€. μ€μ νλ©΄μ΄ κ°±μ λμ΄ νμλλ μ£ΌκΈ°μ λ°λΌ ν¨μλ₯Ό νΈμΆν΄μ£ΌκΈ° λλ¬Έμ μλ°μ€ν¬λ¦½νΈκ° νλ μ μμ μ μ€νλλλ‘ λ³΄μ₯ν΄μ£Όμ΄ μμ κ°μ λ°λ¦Ό νμμ λ°©μ§ν΄μ€λ€.
μλ μ΄λ―Έμ§λ requestAnimationFrame λ₯Ό ν΅ν΄ μ λλ©μ΄μ μ ꡬνν λ, κ° νλ μμ΄ λΈλΌμ°μ μ νλ μ μ£ΌκΈ°μ λ§μΆμ΄ μΌμ ν μκ° κ°κ²©μΌλ‘ λ λλ§λ¨μ 보μ¬μ€λ€. requestAnimationFrame ν¨μκ° μ€νλλ©΄ λΈλΌμ°μ λ λ€μ νλ μμ΄ κ·Έλ €μ§κΈ° μ μ ν¨μλ₯Ό μ€ννλλ‘ μμ½νκΈ° λλ¬Έμ κ° νλ μμ΄ μ νν 16.6ms κ°κ²©μΌλ‘ λ λλ§λκ² λκ² λλ€.
See the Pen setInterval vs requestAnimationFrame by barzz12 (@inpaSkyrim) on CodePen.
μ΄μ²λΌ μ λλ©μ΄μ νλ μμ νμΈν ν μ€λΉκ° λμ λ νΈμΆνλ€λ λΆλΆμ, μ΄μ setInterval λ°©μμ΄ μ€λΉκ° λμ§ μμλ νμΈν μ μμ²νλ κ²κ³Ό λλΉλλ©΄μ, λ³΄λ€ μΉλΈλΌμ°μ μ μ΅μ ν λμ΄ μλ€κ³ λ§ν μ μλ€. λν μ§μ° λ° λΈλ‘νΉ νμμ΄ μκΈ°μ§ μμ λ³΄λ€ λΆλλ¬μ΄ μ λλ©μ΄μ μ μ 곡νλ€.
requestAnimationFrame μ₯μ
λ°±κ·ΈλΌμ΄λ λμ μ€μ§
setInterval κ°μ κ²½μ° λΈλΌμ°μ μ λ€λ₯Έ ν νλ©΄μ 보거λ λΈλΌμ°μ κ° μ΅μνλμ΄ μμ λ κ³μ νμ΄λ¨Έκ° λμ μ½λ°±μ νΈμΆνκΈ° λλ¬Έμ μμ€ν 리μμ€ λλΉλ₯Ό μ΄λνκ³ λΆνμν μ λ ₯μ μλͺ¨νκ² λ§λ λ€.
λ°λ©΄ requestAnimationFrameλ νμ΄μ§κ° λΉνμ±ν λ μνμ΄λ©΄ νμ΄μ§ νλ©΄ 그리기 μμ λ λΈλΌμ°μ μ μν΄ μΌμ μ€μ§λ¨μΌλ‘ CPU 리μμ€λ λ°°ν°λ¦¬ μλͺ μ λλΉνμ§ μκ² λλ€.
λμ€νλ μ΄ μ£Όμ¬μ¨μ λ§κ² νΈμΆ νμ
μ΄ νΉμ§μ μ΅μ νλ μΉ μ λλ©μ΄μ μ ꡬννλλ° μμ΄ setInterval κ³Ό requestAnimationFrame μ κ²°μ μ μΈ μ°¨μ΄μ μ΄λΌκ³ λ§ν μ μλ€. μ§κΈκΉμ§ 1μ΄μ 60λ² νΈμΆνλ€κ³ μ¨μμ§λ§, μ νν λ§νμλ©΄ μμ μ λͺ¨λν°κ° 60hz μ£Όμ¬μ¨ λͺ¨λν°μΌ κ²½μ°μ΄λ€. μ¦, μΉλΈλΌμ°μ λ λμ€νλ μ΄μ μ£Όμ¬μ¨μ λ°λ₯΄λ©° λ§μΌ 144hz μ£Όμ¬μ¨ κ³ μ¬μ λͺ¨λν°μΌ κ²½μ° rAF μμ 1μ΄μ 144λ² νΈμΆλκ² λλ€.
μ 리νμλ©΄ setInterval μμλ μ½λ°± ν¨μ νΈμΆ κ°κ²©μ μκ°μ μ§μ ν΄μ£Όκ³ νΈμΆ νμλ₯Ό μ€μ νμ§λ§, rAFμμλ λͺ¨λν°μ μ£Όμ¬μ¨μ κ·Έλλ‘ λ°λ₯΄κ² λμ΄ μ΅μ ν λμ΄ μλ€λ κ²μ΄λ€. κ·Έλ¦¬κ³ μ΄λ¬ν νΉμ± λλ¬Έμ rAFλ μ€ν¬λ‘€ μ΄λ²€νΈ μ΅μ ν κΈ°λ²μΌλ‘λ μ°μ΄κΈ°λ νλ€.
Animation frames νμμ μ²λ¦¬
requestAnimationFrame(rAF) ν¨μλ setTimeout μ΄λ μ¬ν μ΄λ²€νΈ νΈλ€λ¬μ κ°μ΄ "μ λλ©μ΄μ νλ μ"μ 그리기 μν μ½λ°± ν¨μλ₯Ό λ±λ‘νκ³ λΉλκΈ° taskλ‘ λΆλ₯νμ¬ μ²λ¦¬λλ€. μ΄λ μ€μν νΉμ§μ rAFλ μΌλ°μ μΈ task queueκ° μλλΌ animation frameμ΄λΌλ λ³κ°μ queueμμ μ²λ¦¬λλ€λ μ μ΄λ€.
Animation frames μ λΈλΌμ°μ μ λ λλ§ μμ§μ΄ λ€μ νλ μμ 그리기 μ μ μ€νν΄μΌ νλ rAFμ λ±λ‘ν μ½λ°± ν¨μλ€μ λ΄λ νμ΄λ€. λ³λμ νμμ μ μ¬λμ΄ μ΄λ²€νΈ 루νμ μν΄ κΊΌλ΄μ§κΈ° λλ¬Έμ μ€νμ΄ λ€μ³μ§κ±°λ νλ νμμ κ°μν μκ° μλ€. λ¨, requestAnimationFrameλ λΈλΌμ°μ μ CPUλ GPU μ¬μ©λ μ¬λΆ λ±μ λ°λΌ μ½λ°± ν¨μ μ€νμ΄ λ°λ¦΄ μλ μλ€.
μλ λΈλΌμ°μ μ μλ°μ€ν¬λ¦½νΈ μ΄λ²€νΈ 루ν μ£ΌκΈ°μ μ€νμ κ·Έλ¦ΌμΌλ‘ ννν κ²μ΄λ€. κ·Έλ¦Όμ μ²μ 보면 λκ² λ μνλ‘ λ³΅μ‘νκ² λ³΄μΌ μ μλλ° κ°λ¨ν μ 리νλ©΄ λ€μκ³Ό κ°λ€.
- Task queue 1 - μ΄λ²€νΈ μ½λ°± ν¨μ, setTimeout λ° setInterval λΉλκΈ° μ½λ°± ν¨μλ₯Ό μ²λ¦¬
- Task queue 2 - Task queue 1μ μλ λͺ¨λ μ½λ°± ν¨μλ€μ΄ μ€νλ ν μ€νλμ΄μΌ νλ λ€μ μ½λ°± ν¨μλ€μ΄ λ€μ΄κ°λ€.
- Microtask queue - Promise κ°μ²΄, Mutation Observer κ°μ²΄λ₯Ό μ²λ¦¬ (κ°μ₯ μ°μ μμκ° λμ)
- Animation frames - requestAnimationFrame μ κ°μ΄ λΈλΌμ°μ λ λλ§κ³Ό κ΄λ ¨λ νμ€ν¬ μ²λ¦¬
κ°λ¨ν μ΄λ²€νΈ 루ν νΈμΆ μ€νλ§μ λ³Έ λ μλΆλ€μ λμ΄λκ° μμ§ μμΉνλ λλμ λ°μ μ μκ² μ§λ§, λκ°μ λΉλκΈ° ν¨μλΌλ μ΄λ κ² μ²λ¦¬ μ°μ μμ νκ° λ³λλ‘ μλ€λ μ λ μκ³ μμΌλ©΄ λλ€.
Promise.thenκ²°κ³Όκ°setTimeoutλ³΄λ€ μ°μ λλ€λ μ리λ λ°λ‘ μ΄ λλ¬Έμ΄λ€.
requestAnimationFrame μ¬μ©λ²
requestAnimationFrame μ¬μ©λ²μ setTimeout μ²λΌ μ½λ°± ν¨μ λ΄λΆμμ μ¬κ· νΈμΆ νλ μμΌλ‘ ꡬμ±νλ©΄ λλ€. λΈλΌμ°μ λ μ λλ©μ΄μ
νλ μμ μΆλ ₯ν λλ§λ€ requestAnimationFrame μ λ±λ‘λ μ½λ°± ν¨μλ€μ λΉλκΈ°λ‘ νΈμΆνμ¬, μ λλ©μ΄μ
μ λΆλλ½κ² μΆλ ₯ν΄μ€λ€. λμ μ°¨μ΄μ μ setTimeout μ νμ΄λ¨Έλ₯Ό μ§μ ν΄μ£Όμ΄μΌ νμ§λ§, requestAnimationFrame μ νλ μ λ¨μλ‘ λμνκΈ° λλ¬Έμ λ³λμ λ°λ³΅ νλκ·Έκ° νμ μλ€λ μ μ΄λ€.
const performAnimation = () => {
/* μ€νμΌ μ‘°μ μ€ν¬λ¦½νΈ */
requestAnimationFrame(performAnimation) // ν¨μ λ΄λΆμμ λ€μ requestAnimationFrameμ νΈμΆνμ¬ λ°λ³΅
}
requestAnimationFrame(performAnimation);
κ·Έλ¦¬κ³ setTimeout μ μ·¨μνκΈ° μν΄ clearTimout μ μ¬μ©νλ―μ΄, requestAnimationFrame λ₯Ό μ·¨μνλ λ°©λ²μΌλ‘ cancelAnimationFrame λ₯Ό μ¬μ©νλ€. μλμ κ°μ΄ νΉμ ν 쑰건μμ μ λλ©μ΄μ
μ μ€μ§νκ³ μΆμλ μ΄μ©νλ©΄ λλ€.
let raf; // requestAnimationFrameμ λ΄μ λ³μ
const performAnimation = () => {
/* μ€νμΌ μ‘°μ μ€ν¬λ¦½νΈ */
// νΉμ ν μ‘°κ±΄μΌ κ²½μ° rafλ₯Ό μ€μ§νκ³ μ½λ°± μ’
λ£
if(쑰건) {
cancelAnimationFrame(raf);
return;
}
raf = requestAnimationFrame(performAnimation) // ν¨μ λ΄λΆμμ λ€μ requestAnimationFrameμ νΈμΆνμ¬ λ°λ³΅
}
requestAnimationFrame(performAnimation);
requestAnimationFrame μμ
λ€μμ λ‘μΌ μμκ° μκ³ , requestAnimationFrameλ₯Ό ν΅ν΄ yμ’ν κ°μ μ‘°μ νμ¬ μλ‘ μ¬λ¦¬λ μ½λλ₯Ό λ°λ³΅ νΈμΆνμ¬ μ λλ©μ΄μ
μ μ€ννλ μμ μ΄λ€.
<img class="rocket" src="https://www.freeiconspng.com/thumbs/rocket-png/rocket-png-1.png" alt="λ‘μΌ μ λλ©μ΄μ
">
<count class="value">0</count>
<button>λ€μ μμ</button>
const rocket = document.querySelector('.rocket');
const value = document.querySelector('.value');
let yPos = 0;
let rafId;
// μ½λ°± ν¨μ
const render = () => {
yPos += 2; // y μ’ν μ¦κ°
rocket.style.transform = `translateY(${-yPos}px)`; // λ‘μΌμ μλ‘ μ¬λ¦¬κΈ°
value.innerHTML = yPos; // μΉ΄μ΄ν° νμ
// λ§μ½ λ‘μΌ μμΉκ° μΌμ yμ’νκ°μΌ κ²½μ° requestAnimationFrame μ’
λ£
if (yPos >= 500) {
cancelAnimationFrame(rafId);
return;
}
rafId = requestAnimationFrame(render); // rAF λ°λ³΅ νΈμΆ
}
requestAnimationFrame(render); // μ λλ©μ΄μ
μμ
// λ§μΌ λ‘μΌμ λ§μ°μ€ 컀μλ₯Ό μ¬λ €λμΌλ©΄ μ λλ©μ΄μ
μ€μ§
rocket.addEventListener('mouseover', () => {
cancelAnimationFrame(rafId);
});
// λ§μΌ λ‘μΌμ λ§μ°μ€ 컀μλ₯Ό λΉΌλ©΄ μ λλ©μ΄μ
μ¬μμ
rocket.addEventListener('mouseout', () => {
requestAnimationFrame(render);
});
See the Pen requestAnimationFrame by barzz12 (@inpaSkyrim) on CodePen.
μ λλ©μ΄μ νμ΄λ¨Έ μ΄μ©νκΈ°
requestAnimationFrame ν¨μμ μ½λ°± ν¨μμ μΈμλ‘ λ§€κ°λ³μλ₯Ό μ λ¬νλ©΄ requestAnimationFrame ν¨μκ° μ€νλκΈ° μμν μ΄νμ μκ°μ μ»μ μ μλ€. μ΄λ₯Ό μ΄μ©ν΄ μ λλ©μ΄μ μν μκ°μ κ΅¬ν΄ νΉμ νμ΄λ¨ΈμΌλ μ€ν¬λ¦½νΈλ₯Ό μ€ννλ μμ μμ©μ΄ κ°λ₯νλ€.
let startTime;
// requestAnimationFrameμ μ½λ°± ν¨μμ 맀κ°λ³μλ₯Ό μ μ
const draw = (timestamp) => {
if (!start) start = timestamp; // μ λλ©μ΄μ
μμ μκ°
currentTime = timestamp - startTime;
// μ λλ©μ΄μ
μ΄ μ€νλμ§ 2μ΄κ° μ§λλ©΄..
if(currentTime > 2000) {
console.log('END');
return;
}
requestAnimationFrame(draw);
}
requestAnimationFrame(draw);
# μ°Έκ³ μλ£
https://youtu.be/9XnqDSabFjM
https://dribbble.com/shots/1945400-FPS-frames-per-second
https://jbee.io/web/optimize-scroll-event/