CADisplayLink

2022. 5. 23. 14:53iOS 프레임워크

0. 개발자 문서 확인

iOS에서 뷰 생성과 애니메이션을 공부하던 중 CADisplayLink라는 것을 알게 되었다.

간단히 살펴본 것으로는 화면이 업데이트될 때마다 호출되는 객체라고 적혀있었다.

그래서! 이런 것은 또 못 참고 지나가기에 직접 실험을 진행해보고 싶었다.

 

일단 제일 먼저 확인할 애플 개발자 문서...!

https://developer.apple.com/documentation/quartzcore/cadisplaylink

 

 

 

1. 간단 프레임률 측정

import UIKit

final class ViewController: UIViewController {
  
  override func viewDidLoad() {
    super.viewDidLoad()
    createDisplayLink()
    // Do any additional setup after loading the view.
  }
  
  func createDisplayLink() {
    let displayLink: CADisplayLink = CADisplayLink.init(target: self, selector: #selector(stamp(displaylink:)))
    displayLink.add(to: .main, forMode: RunLoop.Mode.default)
  }
  
  @objc func stamp(displaylink: CADisplayLink) {
    print("\\(displaylink.timestamp) displayUpdated")
  }

}

displayLink를 viewDidLoad()에서 만들어 준 이유는, init시에 셀렉터를 사용하기 위해서였다.

  • displayLink를 add 하는 곳에서 RunLoop를 다루는데, 이것에 관련한 아티클은 다음에 다루도록 하겠다.
    확실히 뷰 쪽을 다루다 보면 자주 접하는 단어인데, 확실히 정리가 필요해 보인다.

 

그랬더니 출력 결과가 수도 없이 많이 나왔다;;

이 실험에 사용한 테스트 기기가 아이폰 13 미니이고, 화면 주사율이 60이니 측정 간격이 0.01667….. 정도인 것 같았다.

0.01667 * 60을 해보니 1.0002가 나왔다. 수치상으로 완벽히 정확한 것은 아니지만 1초에 60 프레임이 재생되는 것은 확실하다는 것을 느낄 수 있었다.


여기서 실제로 프레임 레이트를 확인하기 위해 targetTimestamp 프로퍼티와 timestamp 프로퍼티를 활용하여 실제 프레임 레이트를 구해보았다.

timestamp: 다음 프레임의 예측 값

targetTimestamp: 일정한 프레임 속도가 유지되는지 체크하기 위해 사용하는 값

// 실제 찍힌 프레임의 타임스탬프와 다음으로 예측된 타임을 시간차로 나누어 1초에 몇번정도 나올 수 있는지를 계산함
let actualFramesPerSecond = 1 / (displaylink.targetTimestamp - displaylink.timestamp)

이 값을 통해 확인해본 결과 일반적인 상황에서는 대략 59 프레임, 약 60 프레임임을 확인할 수 있었다.

 

 

 

2. 주사율 제어하기

배터리나 성능과 관련하여 뷰를 최적화하고 싶을 때는 직접 주사율을 제어할 수 있다.

바로 preferredFrameRateRange 프로퍼티를 활용하는 것이다.

displayLink.preferredFrameRateRange = CAFrameRateRange.init(minimum:8, maximum:15, preferred:0)

 

원래는 preferredFramesPerSecond이라는 프로퍼티였으나, 아이폰 13 프로가 나온 이후 가변 주사율을 지원하며 범위를 제공하기 위해 범위로 변경되었다.

이것을 사용하면 정확한 주사율을 지정할 수는 없지만, 근접한 주사율을 제공할 수 있다.

참고 : 아이패드 프로와 아이폰 13 pro 시리즈에서 주사율 최적화 하기

preferredFrameRateRange를 통해 주사율을 제한한 결과 약 15 정도가 나오는 것을 확인할 수가 있었다.

 

이 범위를 정한다고 해서 무조건 이 범위가 되는 게 아닌, 60 주사율을 가진 기기에서는 15, 20, 30, 60 프레임이 가능하고, 조금 더 넓은 범위와 세밀한 주사율 조절이 가능한 기기 (현 13 pro 시리즈)에서는 다양한 주사율이 나올 수 있음을 확인할 수 있었다.


또한 아이패드 프로 11인치 3세대로 확인해 본 결과, 119 프레임으로 잘 나오는 것을 확인할 수 있었다!

아이패드 프로 시리즈는 120 프레임까지 올라가긴 하지만, 아이폰 13 프로 시리즈와는 다르게 세밀한 조절은 불가능하다고 한다.

 

 

CADisplayLink가 Core Animation에 사용된다는 것은 들었지만, 이것을 적절히 활용하는 방법을 몰랐는데, 이렇게 업데이트 주기를 받을 수 있다면 원하는 애니메이션을 커스텀할 수 있다는 생각이 들었다.

애니메이션 커스텀에 관련된 것들도 한번 다뤄볼 계획이다.

'iOS 프레임워크' 카테고리의 다른 글

SwiftUI - 조심스러운 첫 걸음  (0) 2023.11.30
NSLock  (0) 2022.05.25
Core Animation Pipeline  (0) 2022.05.24
UI작업이 Main Thread에서 이뤄져야 하는 이유  (0) 2022.05.20
CGRect, CGSize, CGPoint에 대하여  (0) 2022.04.28