📚 기초 지식

리플로우와 리페인트

Mia_ 2023. 1. 16. 11:43

리플로우(Reflow) : 브라우저 화면 조절, 타 사이트로 이동과 같은 웹 인터렉션으로 인해 렌더링 과정의 레이아웃을 반복 수행하는 것 

리페인트(Repaint) : 웹 인터랙션으로 인해 페인트 과정을 반복 수행하는 것 

 

리플로우와 리페인트의 최적화

- DOM은 변경이 되면 렌더트리를 다시 구축하기 때문에 변경이 될 때마다 리플로우와 리페인트를 다시 해야함 

- 리플로우 과정은 렌더링을 다시하는 것이기 때문에 배치를 위한 연산을 해야 해 실제로 CPU를 많이 차지함

- 리페인트 과정은 페인트를 다시 하는 것으로 픽셀을 다시 화면에 그려야 하기 때문에 GPU를 많이 차지함 → 프레인 드랍 현상과 연관이 있음

* 프레임 드랍? 초당 60프레임으로 유지시키던 프레임 수가 브라우저 과부하로 인해 줄어드는 현상 

- 줄어들어 없어진 프레임은 렌더링 엔진이 인식할 수 없음 → 렌더링 엔진은 드랍된 프레임을 브라우저 화면에 그리지 못함 

 

최적화 방법

1.1 불필요한 레이아웃을 줄인다 

- 레이아웃 과정에서 불필요하게 계산할 것이 많아지면 엔진이 과부하가 생길 수 있음 

- CSSOM 트리의 CSS 속성 중에 레이아웃을 발생 시키는 속성들이 있음 → 해당 속성을 피하면 레이아웃 발생 수를 줄일 수 있음

 

1.2 CSS에서 레이아웃, 페인트를 발생 시키는 속성들 

- 리플로우가 발생하는 속성보다 < 리페인트만 발생하는 속성을 사용해 주늑 서이 좋음 

리플로우가 일어나느 대표적인 속성

position width height left top right
bottom margin padding border border-width clear
display float font-family font-size font-weight line-height
min-height overflow text-align verical-align ..  ..

리페인트가 일어나는 대표적인 속성

background background-image background-position background-repeat background-size border-radius
border-style box-shadow color line-style outline clear
disply float font-family visibility font-size outline-color

 

2. 영향을 주는 노드를 줄인다

- 자바스크립트 + CSS를 조합한 애니메이션이 많거나 레이아웃 변화가 많은 요소의 경우 position을 absolute 또는 fixed를 사용해 주면 영향을 받는 주변 노드들을 줄일 수 있다