0Pricing
HTML Academy · 강의

requestAnimationFrame으로 애니메이션 만들기

애니메이션 프레임 반복으로 부드러운 canvas 애니메이션 만들기

requestAnimationFrame으로 애니메이션 만들기은(는) CoddyKit의 무료 HTML Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 HTML Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. HTML Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

requestAnimationFrame을 사용하는 이유

requestAnimationFrame(rAF)은 다음 브라우저 다시 그리기 전에 콜백을 예약하여 애니메이션을 화면 새로 고침 빈도와 동기화합니다(일반적으로 초당 60프레임). setInterval과 달리 rAF은 탭이 숨겨지면 일시 중지되므로 CPU와 배터리를 절약합니다.

기본 애니메이션 반복

rAF 반복에서는 현재 프레임을 그리는 애니메이션 함수를 정의한 다음, 다음 프레임을 예약하도록 requestAnimationFrame을 호출합니다. 브라우저는 매번 다시 그리기 전에 이 함수를 호출하여 화면의 프레임 속도에 맞춘 연속 애니메이션을 만듭니다.

function animate(timestamp) {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  // draw frame at current state
  draw(timestamp);
  requestAnimationFrame(animate);
}
requestAnimationFrame(animate);

timestamp 매개변수

rAF은 페이지가 로드된 후 경과한 밀리초를 나타내는 고해상도 시간 값을 콜백에 전달합니다. 이를 사용하면 프레임 속도와 무관한 움직임을 계산할 수 있습니다: delta = timestamp - lastTimestamp. 속도에 delta를 곱하면 프레임 속도와 관계없이 초당 같은 거리를 이동합니다.

프레임 속도와 무관한 움직임

마지막 프레임 이후 경과한 시간을 계산하고 그에 따라 움직임의 크기를 조정하세요. 초당 100픽셀로 움직이는 객체는 프레임마다 100 * (delta / 1000)픽셀을 이동합니다. 이렇게 하면 초당 30프레임과 초당 144프레임인 화면에서 물리 동작이 일관되게 유지됩니다.

애니메이션 중지

rAF은 핸들을 반환합니다. cancelAnimationFrame(handle)로 취소하세요. 핸들을 변수에 저장하고 반복문 안에서 실행 중 플래그를 확인하거나, 구성 요소를 정리할 때 취소할 수 있습니다. 요소가 DOM에서 제거될 때는 항상 반복을 취소하세요.

캔버스 애니메이션 패턴

각 프레임에서 다음 순서로 처리합니다: (1) 전체 캔버스에 clearRect를 적용하고, (2) 상태 변수(위치, 각도, 시간)를 업데이트하고, (3) 모든 객체를 새로운 위치에 그리고, (4) 다음 프레임을 위해 requestAnimationFrame을 호출합니다. clearRect를 절대 생략하지 마세요. 이전 프레임이 흔적처럼 누적됩니다.

CSS 전환과 rAF 비교

간단한 속성 기반 애니메이션(호버 효과, 모달 슬라이드 인)에는 CSS 전환과 애니메이션을 사용하세요. 각 프레임을 세밀하게 제어해야 하는 복잡한 대화형 애니메이션(게임 반복, 물리 시뮬레이션, 캔버스 렌더링)에는 rAF을 사용하세요.

캔버스의 더블 버퍼링

복잡한 장면에서는 먼저 오프스크린 캔버스에 그린 다음, 한 번의 작업으로 drawImage를 사용해 보이는 캔버스에 그립니다. 이렇게 하면 부분적으로 그려진 프레임을 보여 주지 않으므로 깜박임이 방지되고, 보이는 캔버스가 각 프레임마다 원자적으로 업데이트됩니다.

목표 FPS로 제한하기

더 낮은 프레임 속도(예: 초당 30프레임)로 제한하려면 렌더링하기 전에 마지막 그리기 이후 충분한 시간이 지났는지 확인하세요. if (timestamp - lastDraw >= 1000/30) { draw(); lastDraw = timestamp; }. 반응성을 유지하려면 그와 관계없이 rAF을 예약하세요.

애니메이션 디버깅

Chrome DevTools의 성능 패널은 JS 플레임 차트에 rAF 콜백을 기록합니다. 16밀리초를 초과하는 긴 콜백을 찾으세요. 이러한 콜백은 프레임 누락을 일으킵니다. 렌더링 → FPS 측정기에서 FPS 측정기를 사용하면 상호 작용 중 실시간 프레임 속도를 확인할 수 있습니다.

Web Animations API 대안

직접 시간을 관리하지 않는 더 간단한 선언적 애니메이션에는 element.animate(keyframes, options)를 사용하세요. WAAPI은 시간 함수, 채우기 모드 및 반복을 처리하여 프레임 계산을 브라우저에 맡깁니다. WAAPI으로 표현할 수 없는 사용자 지정 렌더링 논리에는 rAF을 사용하세요.

지식 확인

requestAnimationFrame 반복에서 애니메이션 속도에 delta 시간을 곱해야 하는 이유는 무엇인가요?

요약

requestAnimationFrame은 JavaScript 애니메이션을 화면 새로 고침 빈도와 동기화하고, 숨겨진 탭에서는 일시 중지합니다. timestamp 매개변수를 사용하면 delta 시간에 따른 크기 조정으로 프레임 속도와 무관한 움직임을 구현할 수 있습니다. clear, update, draw, schedule로 구성된 캔버스 애니메이션 반복 패턴과 정리를 위한 cancelAnimationFrame은 부드럽고 효율적인 웹 애니메이션의 기반을 이룹니다.

자주 묻는 질문

“requestAnimationFrame으로 애니메이션 만들기” 강의는 무료인가요?

네 — “requestAnimationFrame으로 애니메이션 만들기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 HTML Academy 강의 전체를 잠금 해제할 수 있습니다. HTML Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“requestAnimationFrame으로 애니메이션 만들기”에서 뭘 배우나요?

애니메이션 프레임 반복으로 부드러운 canvas 애니메이션 만들기 브라우저에서 직접 실행하는 실습 코드로 HTML Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

HTML Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 HTML Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“requestAnimationFrame으로 애니메이션 만들기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 HTML Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 HTML Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. canvas 및 2D 컨텍스트 설정하기
  2. 사각형과 경로 그리기
  3. canvas에 텍스트와 이미지 그리기
  4. requestAnimationFrame으로 애니메이션 만들기
← HTML Academy(으)로 돌아가기