Core Animation Pipeline
Commit Transaction
뷰 레이아웃, 이미지 디코딩, 포맷 변환, 뷰 레이어 패킹 및 렌더링 서버로 전송 (CPU에서 작업)
- Layout: 레이어를 정렬하고 색상 및 상대적 위치와 같은 속성을 설정하는 단계입니다. (layoutSubviews가 호출됨)
- Display: 배경이미지가 컨텍스트에 그려지는 단계입니다. draw(rect:), draw(_:in:)과 같은 메서드들이 접근한다. (참고로 개발자가 draw를 직접 호출하면 안됩니다. setNeedsDisplay를 사용)
- Prepare: 이 단계에서 Core Animation은 draw할 수 있도록 renderer에 컨텍스트를 보내려고 할 때 image decoding과 같은 몇 가지 필수적인 작업을 수행합니다.
- Commit: Core Animation은 layer들을 pakaging 하여 render server로 보냅니다.
Render Server
commit transaction에서 전송된 패키지를 분석하고 렌더링 트리로 deserialization. 그 후 뷰 레이어 프로퍼티에 따라 drawing 지시사항을 생성하여 다음 VSync Signal 때 OpenGL이 스크린을 렌더링 하도록 호출합니다.
GPU
스크린의 VSync Signal을 기다렸다가 렌더링을 위해 OpenGL을 사용한다. 렌더링 후 결과를 버퍼에 전송한다
Display
버퍼로부터 데이터를 가져와 화면에 보여주기 위해 전송한다.
Rasterization
- 오프 스크린 렌더링이 필요합니다.
- 어느 시점에서든 변경되는 하위 레이어가 없습니다.
- CALayer 에는 shouldRasterize 라는 속성이 있습니다. 이 속성이 활성화되면 합성하기 전에 레이어를 비트 맵으로 한번만 렌더링해야 함을 나타냅니다. 레이어를 지속적으로 다시 렌더링 할 필요가 없기 때문에 성능이 크게 향상 될 수 있습니다.
- cache의 크기는 2.5x screen size로 제한됩니다. GPU에서 작업하기에 너무 큰 이미지는 CPU에서 프로세스됩니다.
- 100ms 이상 사용되지 않으면 cache에서 제거됩니다.
- 필요한 이미지가 cache에 없을 때마다 offscreen render pass가 발생합니다. -> 따라서 지속적으로 사용되는 이미지에만 shouldRasterize을 사용해야합니다.
drawsAsynchronously : draw가 백그라운드 스레드에서 비동기적으로 실행됨. 일부 앱에서 성능이 향상될 수 있음
참고 및 출처