10

既然我们在谈论programmatically仪器不在我的考虑范围之内。

预先列出的一些参考资料:

1. 使用CADisplayLink

根据文档,

持续时间属性提供帧之间的时间量。您可以在应用程序中使用此值来计算显示的帧速率...

所以在我的演示项目中,我为 UITrackingRunLoopMode 添加了一个 displayLink 到 mainRunLoop:

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

并用于duration计算 FPS。但出乎我的意料,duration无论 tableView 是否平滑滚动,它总是 0.016667 (~ FPS 60)。

我如何使 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 的正确/最佳方法是什么?

谢谢!

4

2 回答 2

2

正如CADisplayLink 的文档所述duration基本上只是1 / maximumFramesPerSecond. 您需要检查targetTimestamptimestamp检测丢帧之间的差异:

持续时间属性提供最大帧数每秒帧之间的时间量。要计算实际的帧持续时间,请使用 targetTimestamp - 时间戳。

于 2017-10-03T09:47:02.640 回答
1

这可行,但需要一些设置。

  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;
    }
    
于 2015-11-28T22:02:50.380 回答