[iOS] 드래그 제스처 최적화로 60fps 달성하기

드래그 제스처 최적화로 60fps 달성하기

1. 문제 상황

Pan Gesture Recognizer를 이용해서 Constraint의 값을 변경해서 드래그 제스쳐를 구현했습니다. 이렇게 구현했을 때 터치 반응이 부드럽지 않고 버벅이는 현상이 발생했습니다. 그래서 Instruments의 Animation Hitches를 통해 분석해본 결과, 60Hz 디스플레이에서 기대되는 16.67ms 이내의 프레임 처리 시간을 맞추지 못하는 것을 확인했습니다.

Analyze

2. 원인 분석

Auto Layout은 Cassowary 알고리즘을 사용하여 제약 조건을 해결합니다. 이 알고리즘의 시간 복잡도는 일반적인 경우 O(n)이지만, 제약 조건의 복잡도에 따라 최악의 경우 O(n³)까지 증가할 수 있습니다. 드래그와 같은 연속적인 움직임에서는 매 프레임마다 이 계산을 수행해야 하므로, 제약 조건이 많거나 복잡한 경우 CPU에 상당한 부하가 발생할 수 있습니다.

iOS의 Auto Layout에서 사용하는 알고리즘

3. 해결 방법: CGAffineTransform을 통한 성능 최적화

문제 해결을 위해 CGAffineTransform을 사용하여 드래그 제스처를 다시 구현했습니다. CGAffineTransform은 2D 변환을 위한 간단한 행렬 연산을 사용하며, Core Animation이 이러한 변환을 효율적으로 처리합니다.

최적화 이점:

  1. 간단한 행렬 연산: Transform은 단순한 행렬 곱셈으로 처리되므로, Auto Layout의 복잡한 제약 조건 해결 과정에 비해 훨씬 가벼운 연산입니다.
  2. Core Animation 최적화: Core Animation은 transform, position, bounds과 같은 레이어 속성 변경을 최적화된 방식으로 처리하며, 가능한 경우 하드웨어 가속을 활용합니다.

Affine Transform에 대해서는 컴퓨터 그래픽스 수업을 들으면서 정리한 내용이 있는데, 추후에 그래픽스 관련 글들을 블로그에 다시 정리하는 걸로..

4. 결과 검증

Instruments의 Animation Hitches를 통해 다시 분석한 결과, CGAffineTransform을 사용한 구현에서는 안정적으로 60fps를 유지하는 것을 확인할 수 있었습니다. CPU to Display Latency도 8-10ms 이내로 유지되어, 60Hz 디스플레이에서 요구되는 16.67ms 프레임 시간을 충분히 만족했습니다.

Analyze