- what are render phase?
- 앱은 UI를 변화시킨 다음에 렌더링 서버로 이를 넘김
- 랜더링 과정에서는 모든 foreground 프로세스에 대한 render comiit을 처리
- 렌더링 과정이 길어져서 다음 VSYNC까지 프레임이 준비되지 않으면, hitch가 일어남
- 렌더링 자체는 다른 프로세스에서 일어나지만, 과정의 시작과 끝은 앱에서 일어나므로 이를 측정할 수 있음
- 렌더링 과정
- Render prepare
- 커밋에서 애니매이션을 여러 프레임으로 분리한다
- 레이어와 이펙트를 쪼개서 간단한 연산들로 만든다.
- Render Execute
- 위에서 쪼개진 작업들을 파이프라인으로 실행한다.
- 처리된 결과물을 최종 프레임 이미지로 합친다.
- 자세한 렌더링 과정
- render Prepare 과정에서 모든 레이어들을 깊이 우선 탐색으로 탐색해서 선형화시킨다.
- render execute 단계에서 최종 텍스쳐에 위에서 준비된 되로 처리한다.
- shadow는 본체가 그려지기 전에 아래에 그려져야 한다. 그래서 최종 텍스쳐 말고 다른 텍스쳐를 만들어서 거기에 shadow가 적용된 레이어들을 그린 다음에 검게 만들고 블러처리한다. 이후에 최종 텍스쳐로 결과물을 복사한다. -> offscreen rendering
- offscreen rendering은 비용이 많이 들기 때문에 최소화 해야 성능이 나온다.
- offscreen rendering이 필요한 것들
- shadowing
- masking
- offscreen에서 전체를 그린뒤, 마스킹 된 부분만 최종 텍스쳐로 가져온다.
- rounded rectangle
- visual effects
- vibrancy, blur의 2종류
- 이펙트를 offscreen에 적용한 뒤에, 이 값을 최종 텍스쳐에 복사함
- hitch 측정
- animation Hitches Instrument 사용
- render count 부분을 확인해서 너무 많지 않은지 확인하라
- view Debugger에서도 유용한 프로퍼티들을 볼 수 있다.
- 레이어를 트리에 띄우도록 할 수 있다.
- 이 레이어의 offScreen count도 볼 수 있다.
- Xcode 12에 optimization Opportunities 옵션이 생겼다.
- 추천방법
- 기본 API를 써라
- shadowPath
- cornerRadius, cornerCurve
- 마스킹을 최적화하라
- 커스텀 마스킹 보다는 maskToBound를 쓰자
- 마스킹이 필요 없으면 maskToBound를 false로 하라