합성(compositing)은 화면에 표시하기 위해 페이지에서 페인트된 부분을 합치는 과정입니다.
합성은 페이지에서 페인트된 부분을 합치는 과정입니다. 화면에 표시됩니다.
이 영역에는 페이지 성능에 영향을 미치는 두 가지 핵심 요소가 있습니다. 관리해야 하는 컴포지터 레이어의 수와 애니메이션에 사용하는 속성입니다.
요약
- 애니메이션의 변형 및 불투명도 변경을 고수하세요.
will-change
또는translateZ
를 사용하여 이동 요소를 승격합니다.- 프로모션 규칙을 과도하게 사용하지 않습니다. 메모리와 관리가 필요합니다
애니메이션에 변형 및 불투명도 변경 사용
성능이 가장 우수한 픽셀 파이프라인 버전은 레이아웃과 페인트를 모두 피하며 합성 변경사항만 요구합니다.
![레이아웃이나 페인트가 없는 픽셀 파이프라인](https://web.developers.google.cn/static/articles/stick-to-compositor-only-properties-and-manage-layer-count/image/the-pixel-pipeline-no-la-96825803c8cec.jpg?authuser=19&hl=ko)
이렇게 하려면 컴포지터가 단독으로 처리할 수 있는 변경 속성을 고수해야 합니다. 현재 true인 속성은 transform
및 opacity
두 개만 있습니다.
![레이아웃 또는 페인트를 트리거하지 않고도 애니메이션을 적용할 수 있는 속성입니다.](https://web.developers.google.cn/static/articles/stick-to-compositor-only-properties-and-manage-layer-count/image/the-properties-can-anima-100ed2c7d26a4.jpg?authuser=19&hl=ko)
transform
및 opacity
사용 시 주의는 이러한 속성을 변경하는 요소가 자체 컴포지터 레이어에 있어야 한다는 것입니다. 레이어를 만들려면 요소를 승격해야 합니다. 이에 대해서는 다음에 다룰 것입니다.
애니메이션을 적용할 요소 승격
'페인트 복잡성 단순화 및 페인트 영역 줄이기' 섹션에서 애니메이션을 적용할 요소를 자체 레이어로 승격해야 합니다 (합당한 범위 내에서 과도한 사용은 하지 말 것).
.moving-element {
will-change: transform;
}
또는 이전 브라우저나 will-change를 지원하지 않는 브라우저의 경우 다음을 수행합니다.
.moving-element {
transform: translateZ(0);
}
레이어 관리 및 레이어 급증 방지
레이어가 성능에 도움이 되는 경우가 많다는 것을 알면 페이지의 모든 요소를 다음과 같이 승격하고 싶을 것입니다.
* {
will-change: transform;
transform: translateZ(0);
}
이는 페이지의 모든 단일 요소를 승격하고 싶다는 우회적인 표현입니다. 여기서 문제는 만드는 모든 레이어가 메모리와 관리가 필요하며 이는 무료가 아니라는 점입니다. 실제로, 메모리가 제한된 기기에서는 성능에 미치는 영향이 레이어 생성의 이점보다 훨씬 클 수 있습니다. 모든 레이어의 텍스처는 GPU에 업로드해야 하므로 CPU와 GPU 간의 대역폭과 GPU의 텍스처에 사용할 수 있는 메모리 측면에서 추가적인 제약이 있습니다.
Chrome DevTools를 사용하여 앱의 레이어 이해하기
![Chrome DevTools의 페인트 프로파일러 전환 버튼](https://web.developers.google.cn/static/articles/stick-to-compositor-only-properties-and-manage-layer-count/image/the-toggle-the-paint-pro-0bfd1048bb7de.jpg?authuser=19&hl=ko)
애플리케이션의 레이어와 요소에 레이어가 있는 이유를 이해하려면 Chrome DevTools에서 페인트 프로파일러를 사용 설정해야 합니다. 일정:
이 기능이 켜져 있으면 녹화해야 합니다. 녹화가 완료되면 개별 프레임을 클릭할 수 있습니다. 이 프레임은 초당 프레임 수 막대와 세부정보 사이에 있습니다.
![개발자가 프로파일링하려는 프레임입니다.](https://web.developers.google.cn/static/articles/stick-to-compositor-only-properties-and-manage-layer-count/image/a-frame-developer-is-int-195784f471018.jpg?authuser=19&hl=ko)
이것을 클릭하면 세부정보: 레이어 탭에 새로운 옵션이 제공됩니다.
![Chrome DevTools의 레이어 탭 버튼](https://web.developers.google.cn/static/articles/stick-to-compositor-only-properties-and-manage-layer-count/image/the-layer-tab-button-chr-b74ebc86acad5.jpg?authuser=19&hl=ko)
이 옵션을 선택하면 해당 프레임 동안 모든 레이어를 이동, 스캔 및 확대/축소할 수 있는 새 보기가 각 레이어가 생성된 이유와 함께 표시됩니다.
![Chrome DevTools의 레이어 뷰](https://web.developers.google.cn/static/articles/stick-to-compositor-only-properties-and-manage-layer-count/image/the-layer-view-chrome-de-04740f747ced7.jpg?authuser=19&hl=ko)
이 보기를 사용하여 레이어 수를 추적할 수 있습니다. 스크롤 또는 전환과 같이 성능이 중요한 작업 중에 합성에 많은 시간을 소비하는 경우 (약 4~5ms를 목표로 해야 함) 여기에 있는 정보를 사용하여 레이어 수와 생성 이유를 확인하고 거기에서 앱의 레이어 수를 관리할 수 있습니다.