由于我们在讨论programmatically
,乐器不在我的考虑范围内。
事先列出的一些参考文献:
根据文件,
持续时间属性提供帧之间的时间量。您 可以在您的应用程序中使用此值来计算帧速率 显示......
所以在我的演示项目中,我为mainRunLoop添加了一个displayLink,用于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
,它有效。
drawRect:
?我的第二个想法是观察drawRect:
,我想当tableView滚动时,它的drawRect:
将被逐帧调用,然后我可以根据{{1}之间的时间差来计算FPS。呼叫。
但它失败了,因为drawRect:
只被调用一次(而细胞多次被调用)。这种方式类似于drawRect:
,但也许我选择了错误的位置/方法(如Using CADisplayLink
)来观察,我建议的观察方法是什么?
drawRect:
错了吗?谢谢!
答案 0 :(得分:0)
这有效但需要一些设置。
一旦回调或回调内,您就可以获得帧率。这里有一些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;
}
答案 1 :(得分:0)
作为the documentation for CADisplayLink states,duration
基本上只是1 / maximumFramesPerSecond
。您需要检查targetTimestamp
和timestamp
之间的差异,以检测丢帧:
duration属性提供maximumFramesPerSecond之间帧之间的时间量。要计算实际帧持续时间,请使用targetTimestamp - timestamp。