CSS 애니메이션의 성능 모니터링


(Virendra Singh) (2020 년 4 월 22 일)

자바 스크립트를 사용한 애니메이션 ? 또는 CSS를 사용한 애니메이션 ?

이 질문은 기술 경력에서 한 번 또는 두 번 이상 모든 개발자에게 해당됩니다.

시간이 지남에 따라 Javascript 괴짜들은 브라우저에서 애니메이션을 수행 할 수있는 많은 라이브러리를 생각해 냈습니다. 이러한 라이브러리를 기성 솔루션으로 사용하는 것으로 확신합니다. 그러나 잠시만 요, 이것이 올바른 해결책입니까? JavaScript를 사용하여 애니메이션을해야합니까? 아니면 네이티브 CSS 구현을 사용하여 더 나은 성능으로 애니메이션을 수행 할 수 있습니까?

이 블로그를 읽고 있으므로 JavaScript 애니메이션에 익숙하다고 가정합니다. 이제 “CSS 기반 애니메이션”에 대해 자세히 살펴보고 성능에 미치는 영향과 함께 CSS 애니메이션의 다양한 맛을 살펴 보겠습니다.

애니메이션의 기반은 CSS 기반 애니메이션에서 자주 사용하는 CSS 속성에 의존합니다. 구현.

position : (절대 / 상대)

transform

불투명도

left, right, top, bottom and 더 많이 있습니다.

애니메이션에 대해 서로 다른 CSS 속성을 사용하는 두 실험의 결과를 살펴 보겠습니다.

(a) 왼쪽 및 상단이있는 절대 위치

(b) 변환

또한 이러한 실험을 기반으로 성능 및 렌더링 시간에 대한 결론을 도출해 보는 것은 어떻습니까?

이 두 가지 예를 살펴보면 비슷한 느낌이 듭니다. 기능이 imp되었습니다 다른 접근 방식을 사용하더라도 구현됩니다. 그러나 Chrome dev-tool에서 성능 메트릭을 측정 할 때 두 경우 모두 성능 측면에서 실제 차이를 볼 수 있습니다.

이러한 성능 메트릭을 이해하기 전에 브라우저가 어떻게 작동하는지 이해해야합니다. UI 및 UI에서 업데이트가 발생할 때 수행하는 모든 작업을 렌더링합니다.

따라서 UI 생성은 다음으로 시작됩니다.

1) 요소에 적용 할 스타일 계산 (스타일 다시 계산)

2) 요소의 레이아웃을 생성하고 화면에 배치 (Layout)

3) 생성 된 모든 레이아웃에 픽셀을 추가합니다. 각 레이어에 대해 비트 맵을 생성하는 것에 가깝습니다. GPU는이 비트 맵을 사용하여 화면에 레이어를 렌더링합니다 (Paint)

4) 마지막으로 화면에 레이어를 만들어 레이어 스택을 구성합니다. 이 스택의 상위 뷰는 모든 요소가 자신의 위치 (복합 레이어)를 갖는 완전한 웹 페이지처럼 보일 것입니다.

복합 레이어 생성은 CPU가 GPU와 통신하여 처리하는 곳입니다. 애니메이션. 변환 및 불투명도와 같은 속성을 사용하면 브라우저가 대신 GPU를 사용하여 애니메이션을 수행하도록 할 수 있습니다. CPU.

GPU가 부드러운 애니메이션을 수행하는 데 어떻게 도움이 되나요?

GPU는 애니메이션을 처리하는 또 다른 소형 기계이며 많은 수의 UI 계산을 처리 할 수 ​​있습니다.

따라서 합성 레이어 생성이 트리거되면 다른 레이어를 생성합니다. 이는 애니메이션이 적용되는 요소와 UI 요소의 다른 부분을 다시 렌더링하지 않도록하는 또 다른 방법입니다.

아래 그림에서 두 개의 빨간색 공은 같은 레이어에있는 것처럼 보입니다. 하지만이 레이어를 3D 회전으로 이동하면 Transform 애니메이션에는 빨간 공을 위해 생성 된 또 다른 레이어가있어 부드러운 애니메이션을 제공합니다.

GPU는이 렌더링 개체 트리를 메모리에 유지하며 다시 렌더링하지 않습니다. ,이 레이어를 다른 레이어 위에 놓을 수 있습니다. 그러나 왼쪽 상단의 애니메이션의 경우 이러한 속성의 변경으로 인해 동일한 레이어가 반복해서 렌더링됩니다. 이 두 CSS 속성의 동작을 확인하면 두 속성 모두 왼쪽 top 레이아웃에 영향을 주어 다시 그리기 및 합성 작업을 유발합니다.

번역 상단 / 왼쪽

위의 공 애니메이션은 translate vs top / left .

상단 / 왼쪽의 경우 animation, 공은 최종 목적지에 도달 할 때까지 각 위치에서 렌더링되고, 다시 초기 위치로 이동하기 시작하면 렌더링 부분을 시작합니다.

참고 : 자주색은 빨간 공의 레이아웃 생성을 나타내며 녹색은 픽셀을 정리하는 데 사용됩니다.

위의 두 사진은 실적과 번역 방법을 보여주는 스크린 샷입니다. top / left .

각 작업의 단일 작업을 강조함으로써 우리는 이해하기 시작합니다 두 경우 모두 작업에서 수행하는 활동이 다릅니다. 상단 / 왼쪽 사례 에서 작업은 레이아웃 생성, 페인팅 및 스타일 재 계산을 수행했습니다. 번역의 경우 , GPU는 DOM에서 아무것도 렌더링하지 않고 복합 레이어를 이동합니다.

따라서 GPU 성능을 통해 메인 스레드를 자유롭게 유지합니다. 이를 통해 애플리케이션 성능을 높이는 데 도움이되며 메인 스레드는 레이아웃 렌더링이 바쁩니다.

위의 성능 메트릭 그래프는 더 많은 증거를 제공하여 메인 스레드가 레이아웃 및 스타일 재 계산에 사용되는 정확한 범위를 설명합니다. 이 그래프는 UI에서 발생하는 변화를 지속적으로 반영합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다