Сколько способов программно рассчитать частоту кадров (кадров в секунду) приложения для iOS?
Поскольку мы говорим о programmatically
Инструменты не находятся на моем рассмотрении.
Некоторые ссылки указаны заранее:
- Рассчитать частоту кадров (кадров в секунду) для приложения iphone
- Отображение FPS на iOS на экране (без инструментов)
- На какой частоте кадров пользовательский интерфейс iOS запускает анимацию?
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:
) наблюдать, какой рекомендованный для меня метод наблюдения?
Вопросы:
- Как приборы точно измеряют FPS?
- Сказал док
using duration to calculate FPS
неправильно? - Какой правильный / лучший метод для расчета FPS?
Спасибо!
2 ответа
Как говорится в документации для CADisplayLink, duration
в основном просто 1 / maximumFramesPerSecond
, Вам необходимо проверить расхождение между targetTimestamp
а также timestamp
обнаружить пропущенные кадры:
Свойство duration предоставляет интервал времени между кадрами в MaximumFramesPerSecond. Чтобы вычислить фактическую длительность кадра, используйте targetTimestamp - timestamp.
Это работает, но требует некоторой настройки.
- Установите CADisplayLink и оставьте frameInterval по умолчанию (снимает один раз за кадр)
- Этот CADisplayLink необходимо добавить в runLoop и запустить хотя бы один раз, чтобы попасть в #3
Как только это перезвонит, или внутри обратного вызова, вы можете получить частоту кадров. Вот некоторый код Swift, чтобы дать вам идею, но где
displayLink
ваш экземпляр CADisplayLinkvar 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; }