Сколько способов программно рассчитать частоту кадров (кадров в секунду) приложения для iOS?

Поскольку мы говорим о programmaticallyИнструменты не находятся на моем рассмотрении.

Некоторые ссылки указаны заранее:

1. Использование CADisplayLink

Согласно документу,

Свойство duration указывает количество времени между кадрами. Вы можете использовать это значение в вашем приложении для расчета частоты кадров дисплея...

Поэтому в моем демонстрационном проекте я добавляю displayLink к mainRunLoop для UITrackingRunLoopMode:

self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(screenDidUpdated)];
[self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];

и использовать duration рассчитать FPS. Но из моих ожиданий, duration всегда равно 0,016667 (~ FPS 60), независимо от того, плавно прокручивается tableView или нет.

Как сделать отставание tableView, чтобы добавить одну строку в - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath:

NSData *data = [NSData dataWithContentsOfURL:url];

Затем я повернулся к displayLink.timestampи это сработало.

2. Наблюдение drawRect:?

Моя вторая идея - наблюдать drawRect:, Я думал, когда прокручивает tableView, его drawRect: будет называться кадр за кадром, тогда я мог бы рассчитать FPS в соответствии с разницей во времени между drawRect: призвания.

Но это не удалось, потому что drawRect: был вызван только один раз (в то время как клетки много раз). Этот способ похож на Using CADisplayLink, но, возможно, я выбрал неправильную позицию / метод (например, drawRect:) наблюдать, какой рекомендованный для меня метод наблюдения?

Вопросы:

  1. Как приборы точно измеряют FPS?
  2. Сказал док using duration to calculate FPS неправильно?
  3. Какой правильный / лучший метод для расчета FPS?

Спасибо!

2 ответа

Как говорится в документации для CADisplayLink, duration в основном просто 1 / maximumFramesPerSecond, Вам необходимо проверить расхождение между targetTimestamp а также timestamp обнаружить пропущенные кадры:

Свойство duration предоставляет интервал времени между кадрами в MaximumFramesPerSecond. Чтобы вычислить фактическую длительность кадра, используйте targetTimestamp - timestamp.

Это работает, но требует некоторой настройки.

  1. Установите CADisplayLink и оставьте frameInterval по умолчанию (снимает один раз за кадр)
  2. Этот CADisplayLink необходимо добавить в runLoop и запустить хотя бы один раз, чтобы попасть в #3
  3. Как только это перезвонит, или внутри обратного вызова, вы можете получить частоту кадров. Вот некоторый код Swift, чтобы дать вам идею, но где displayLink ваш экземпляр CADisplayLink

    var framesPerSecond : Int {
        var retVal : Int = 60 // default value, just in case link.duration is still 0 
        if let link = displayLink where link.duration > 0 {
            retVal = Int(round(1000 / link.duration)/1000)
        }
        return retVal;
    }
    
Другие вопросы по тегам