有多少种方法可以通过编程方式计算iOS应用程序的FPS(每秒帧数)?

时间:2014-11-12 13:43:03

标签: ios objective-c drawrect frame-rate cadisplaylink

由于我们在讨论programmatically乐器不在我的考虑范围内。

事先列出的一些参考文献:

1。使用CADisplayLink

根据文件,

  

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

所以在我的演示项目中,我为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,它有效。

2。观察drawRect:

我的第二个想法是观察drawRect:,我想当tableView滚动时,它的drawRect:将被逐帧调用,然后我可以根据{{1}之间的时间差来计算FPS。呼叫。

但它失败了,因为drawRect:只被调用一次(而细胞多次被调用)。这种方式类似于drawRect:,但也许我选择了错误的位置/方法(如Using CADisplayLink)来观察,我建议的观察方法是什么?

的问题:

  1. 仪器如何准确测量FPS?
  2. docdrawRect:错了吗?
  3. 计算FPS的正确/最佳方法是什么?
  4. 谢谢!

2 个答案:

答案 0 :(得分:0)

这有效但需要一些设置。

  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;
    }
    

答案 1 :(得分:0)

作为the documentation for CADisplayLink statesduration基本上只是1 / maximumFramesPerSecond。您需要检查targetTimestamptimestamp之间的差异,以检测丢帧:

  

duration属性提供maximumFramesPerSecond之间帧之间的时间量。要计算实际帧持续时间,请使用targetTimestamp - timestamp。