我可以用10ms drawRect获得60fps吗?

时间:2014-12-15 22:32:31

标签: ios uiview cadisplaylink

我已经问了一个关于CADisplayLinkdrawRect如何表现here的更一般性的问题,但由于这个问题还没有任何答案,我想我会问一个问题。更具体的一个:有没有人设法让一个应用程序以60fps运行,drawRect方法需要大约10毫秒才能执行?

在我的应用中,我像这样配置CADisplayLink

displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

并且update方法只是在我的自定义UIView上调用setNeedsDisplay(以及检查跳过的帧):

- (void)update
{
    static CFTimeInterval timestamp = 0;

    // check for skipped frame
    CFTimeInterval newTimestamp = displayLink.timestamp;
    if ((newTimestamp - timestamp) > (displayLink.duration * (displayLink.frameInterval + 0.5)))
        NSLog(@"Frame skipped!");
    timestamp = newTimestamp;

    [myView setNeedsDisplay];
}

一旦drawRect花费超过4或5毫秒,这就开始跳过帧。就我的目的而言,它需要大约10-11ms,但我认为给定1 / 60fps = 16.7ms这应该没问题。

有没有人实现这个目标?我做错了什么?

1 个答案:

答案 0 :(得分:4)

  

我只是不明白为什么我不能在帧之间使用完整的16ms

除了您正在处理的一个视图外,屏幕刷新时会绘制其他内容。 (例如,状态栏时钟。)此外,drawRect:中的任何内容都不是硬件加速的。因此,一些计算能力正在做其他事情(后台下载,iCloud同步等)

使用drawRect:,你永远无法可靠地获得60fps。您可以尝试使用缓存和Apple的其他drawing tips来提高性能。使用Core Animation或SceneKit也可以获得更好的性能,这两者都是高度优化的。