본문 바로가기

공부

requestAnimationFrame 정리

최근 requestAnimationFrame이라는 브라우저 API를 많이 사용하고 있다.

 

크롬에서 웹을 개발할 때는 렌더링 성능이 좋기 때문에 그냥 css의 translate를 사용하면 웬만한 요구사항은 해결할 수 있지만

 

웹뷰에서는 성능이 좋지 않기 때문에 평범한 css의 translate도 굉장히 버벅이게 된다.

 

특히 translate 되는 Element가 화면에서 클수록 사용자 체감은 크다.

 

보통 프론트엔드를 처음 배울 때 javascript 보다 css를 이용해 구현하는 것이 성능적으로 좋다고 배웠는데

 

꼭 그런 것은 아닌 것 같다.

 

css의 최대 단점은 기기의 성능에 영향을 많이 받기 때문에

 

디바이스, 브라우저 상관없이 균일한 사용자 경험을 위해서라면 번거롭더라도 javascript를 이용하는 것이 사용자 경험에선 더 좋은 선택인 것 같다.

 

 

requestAnimationFrame(callback)은 프레임 단위로 콜백 실행을 보장하는 api 이다.

 

일반적으로 주기마다 반복적으로 콜백을 실행하는 setInterval과 비슷하지만 아주 아주 중요한 차이들이 있다.

 

 

setInterval과의 차이?

 

setInterval은 사용자가 실행 간격(interval)을 지정할 수 있지만

 

requestAnimationFrame은 사용자가 임의로 지정할 수 없다.

 

그렇다고 정해진 간격도 없는데 이유는 모니터 주파수에 따라 간격이 달라진다.

 

보통 60hz 모니터라면 1초에 60번, 즉 16.6ms마다 콜백을 1회 실행시킨다.

 

 

어떻게 실행을 보장하는가?

 

프레임이 업데이트 되기 전에 animationFrameQueue가 따로 있어서 그 큐에 있는 콜백을 실행시킨다.

 

 

만약 큐에 콜백들이 엄~~~~청 많다면 어떻게 되는가?

 

실행을 보장하기 위해 큐에서 콜백들을 임의로 제거시킨다. 큐에 얼마나 많은 콜백들이 담길 수 있는지는 디바이스마다 다르다.