DOM + CSSOM -> Render Tree -> LayOut -> Paint -> Composite 순
이런 과정이 자주 반복되면 화면을 새로 그리는 것이 느려짐.
transform, opacity 등의 속성을 활용하여 해당 요소를 별도의 레이어로 분리 & GPU에게 위임하여
애니메이션 성능 향상 가능.
애니메이션의 기본 원리는 여러장의 이미지를 빠르게 전환하여
눈에 잔상을 남겨 연속되는 것처럼 보이는 것.
보통 일반적인 디스플레이의 주사율은 60Hz 이다.
이말은 1초에 60장의 화면을 새로 그린다는 말.
애니메이션이 끊기는 Jank가 발생했다면 이게 제대로 되지 않았다는 말.
<script>
const hzDisplay = document.getElementById("hz-display");
// 프레임 간의 타임스탬프를 저장할 배열
const frameTimestamps = [];
const numFramesToAverage = 60; // 평균을 낼 프레임 수
function measureRefreshRate(timestamp) {
// 타임스탬프 배열에 현재 프레임의 타임스탬프 추가
frameTimestamps.push(timestamp);
// 배열이 너무 길어지면 가장 오래된 타임스탬프 제거
if (frameTimestamps.length > numFramesToAverage) {
frameTimestamps.shift();
}
// 충분한 데이터가 쌓이면 주사율 계산 시작
if (frameTimestamps.length >= 2) {
// 첫 프레임과 마지막 프레임의 시간 차이 계산
const timeDiff =
frameTimestamps[frameTimestamps.length - 1] - frameTimestamps[0];
// 프레임 수
const frameCount = frameTimestamps.length - 1;
// 초당 프레임 수(Hz) 계산
const fps = (frameCount / timeDiff) * 1000;
// 화면에 소수점 한 자리까지 표시
hzDisplay.textContent = fps.toFixed(1);
}
// 다음 프레임에 또 이 함수를 호출하도록 예약
requestAnimationFrame(measureRefreshRate);
}
// 측정 시작
requestAnimationFrame(measureRefreshRate);
</script>
직접적으로 가져올 수는 없고 requestAnimationFrame 이라는 함수를 이용하여 추적해야한다.
requestAnimationFrame은 브라우저에서 리페인트 주기에 따라 호출되는 함수.
이 함수를 1초에 몇번 호출하는지를 계산해서 주사율을 추정해야한다.


이 함수를 활용해서 브라우저가 화면을 갱신하는 주기와 맞추어 애니메이션을 매끄럽게 실행할 수 있다.
requestAnimationFrame 확인