• Hitch가 일어나면, 프레임이 사용자의 움직임을 따라가지 못하게 되면서 앱이 제대로 동작하지 않는 것으로 보인다.
  • Hitch를 위한 metric
    • Hitch Time: 프레임이 지연된 시간(ms 단위)
    • Hitch Ratio: 정해진 구간에서의 초당 Hitch Time
      • 이는 모든 앱이 동일한 프레임으로 동작하지 않기 때문이다.
  • 항상 60 ~ 120 fps여야 하는가? 그렇진 않다.
    • 고의로 업데이트 하지 않는 경우가 있을 수 있다(게임같은 경우는 30, 비디오는 24 같은 fps도 존재한다)
    • 항상 최고 속도로 프레임을 업데이트 할 필요도 없다(시계 앱은 10fps다)
  • XCTest로 측정하기
    • XCTMetrics 중 XCTOSSignpostMetric 사용

    • 이를 위해서는 앱에 os_signpost 신호를 보내야 함 → 시스템 건 자동으로 되어 있고, 커스텀하면 직접 이를 보내야 함

      // 비 애니매이션 용
      os_signpost(.begin, log: logHandle, name: "performInterval")
      os_signpost(.end, log: logHandle, name: "performInterval")
      
      // XCode 12 용으로 나온 애니매이션 용
      os_signpost(.animationBegin, log: logHandle, name: "performAnimationInterval")
      os_signpost(.end, log: logHandle, name: "performAnimationInterval")
      
    • 테스트 예제

      func testScrollingAnimationPerformance() throws {
      	app.launch()
      	app.staticTexts["Meal Planner"].tap()
      
      	let foodCollection = app.collectionViews.firstMatch
      
      	let measureOptions = XCTMeasureOptions()
      
      	measureOptions.invocationOptions = [.manuallyStop]
      
      	measure(metrics: [XCTOSSignpostMetric.scrollDecelerationMetric],
      					options: measureOptions) {
      			foodCollection.swipeUp(velocity: .fast)
      			stopMeasuring() // 위 옵션을 통해서 수동으로 멈출 수 있게 됨
      			foodCollection.swipeDown(velocity: .fast) // 스크롤 상태 원래대로 되돌림
      		}
      }
      
      • UI 테스트 할때는 디버깅 옵션들은 다 끄고, 최대한 릴리즈에 가깝게 실기기에서 해야 된다.