width에 맞게 그래프가 그려지고 있는데 변화하는 것을 화면이 60FPS로 보여주지 못하기 때문에 뚝뚝 끊기는 것으로 보입니다.
브라우저 렌더링 과정
브라우저는 다음과 같은 렌더링 과정을 거칩니다.
DOM + CSSOM
렌더 트리
레이아웃
페인트
컴포지트
1. DOM + CSSOM
HTML 파일과 CSS 등 화면을 그리는데 필요한 리소스를 다운로드 받아 브라우저가 이해할 수 있는 형태로 만드는 파싱과정을 거칩니다. 변환 결과, DOM과 CSSOM이라는 트리구조가 생성됩니다.
2. 렌더 트리
DOM과 CSSOM의 결합으로 생성됩니다. 화면에 표시될 요소의 레이아웃 계산에 사용됩니다. display: none과 같은 설정의 경우 렌더 트리에 포함되지 않습니다.
3. 레이아웃
화면 구성 요소의 위치나 크기를 계산하고, 해당 위치에 요소를 배치하는 작업을 진행합니다.
4. 페인트
요소에 색을 채워넣는 작업을 진행합니다. 배경 색, 글자 색, 테두리 색을 추가합니다. 레이어를 분리해서 작업하기도 합니다.
5. 컴포지트
완성된 레이어들을 하나로 형성하는 작업을 진행합니다.
이러한 과정들을 Performance 패널에서 확인할 수 있습니다.
또한 사람에게 보여지는 화면이 그려지는 위치는 점선이 그려지는 시점입니다.
변경되는 과정, 리플로우, 리페인트
만약 요소의 width나 height가 변경되었다고 하였을 때 브라우저의 가로, 세로 요소를 다시 계산하여야 합니다. 이럴 경우 처음부터 다시 고려하여 그려져야 하는데 이런 과정을 리플로우라고 합니다.
이와 다르게 색상 관련 속성이 바뀔 경우 DOM + CSSOM 등을 처음부터 계산하지 않고 페인트와 컴포지트의 순서만 진행하는 경우도 있습니다.
하드웨어 가속(GPU 가속)
하드웨어 가속은 CPU에서 할 작업을 GPU에 위임하여 효율적으로 처리하는 방법을 말합니다. GPU는 애초에 그래픽 작업을 처리하기 위해 만들어진 것이므로 화면을 그릴 때 굉장히 빠릅니다.
특정 요소에 하드웨어 가속을 사용하려면 요소를 별도의 레이어로 분리하여 GPU로 보내야 하는데, transform 속성과 opacity 속성이 이러한 역할을 합니다. 분리된 레이어는 GPU에 의해 처리되므로 레이아웃 단계나 페인트 단계 없이 요소의 스타일을 변경할 수 있습니다.