Created by 손찬욱 / chanuk.son
이 발표는 Web 개선 포인트 중 랜더링에 대한 이야기입니다
측정 -> 분석 -> 최적화-> 측정 -> 분석 -> 최적화 -> ...
document.getElementById("box").style.height = "100px";
부드러운 애니메이션을 위해서는
위 작업이 모두 16.6ms 내에 처리되어야한다
엘리먼트에 style을 적용하기 위해 계산하는 작업
엘리먼트의 style 객체가 변경될 때 발생함
document.getElementById("box").style.transform = "translate(0px, 0px)";
각 엘리먼트의 위치, 크기를 계산하는 작업
width, height, left, top, offsetHeight, offsetWidth, scrollTop, 등이 변경될 때 발생함
document.getElementById("box").style.left = "100px";
document.getElementById("box").style.top = "200px";
document.getElementById("box").style.width = "400px";
document.getElementById("box").style.height = "300px";
Layout을 위해, Render Tree를 변경하고,
paint를 위해 텍스쳐를 예약하는 작업
Blink에서 매번 발생.
Layer에 엘리먼트의 픽셀 정보를 기록하는 작업
- border-radius, shadow-box,등과 같은 속성이 변경되었을 때 발생
- img의 src가 변경되어 이미지가 decode 될때 발생
- Layout 작업이 발생한 경우 발생
- 성능 병목의 주 요인
document.getElementById("box").style.borderRadius = "5px";
document.getElementById("logImg").src = "http://m.naver.com/logo.png";
Layer를 변형하여 화면에 그리는 작업
- GPU 가속이 적용된 Layer일 경우, GPU가 담당을 한다
- transform, opacity속성이 변경되었을 때 발생
- 매번 발생함
document.getElementById("box").style.transform = "translate(0px, 0px)";
document.getElementById("box").style.transform = "translate3d(0px, 0px, 0px)";
document.getElementById("box").style.opacity = 0;
웹페이지를 랜더링하기 위해 필요한 이미지 단위 요소
translateZ(0);
tranlate3d(0,0,0);
Layout, Paint를 줄이고, 최적의 Layer를 구성
Layout, paint를 유발하는 속성을 사용하지 않는다.
대신, GPU가 처리할수 있는 변형을 이용하여
같은 효과를 구현한다.
대상 DOM 노드가 주변이나 자신에 의해
자주 변경되지 않는 경우 (transform,opacity 제외) 구성
크롬 Rendering 탭 활용하기
transform,opacity 이용, Layer 사용
다음 사항을 고려해야한다
어떻게 엘리먼트의 속성을 바꿀것인가?
애니메이션 이동은 display:block/inline-block로 지정 후, transform:translate, opacity을 사용한다.
언제 엘리먼트에 변경을 요청할 것인가?
하드웨어 가속은 단말기, OS환경에 따라 적용 범위가 달라짐