4

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

在我的应用程序中,我配置CADisplayLink如下:

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

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

- (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 这应该没问题。

有没有人做到这一点?我究竟做错了什么?

4

1 回答 1

4

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

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

使用drawRect:. 您可以尝试使用缓存和 Apple 的其他一些绘图技巧来提高性能。您还可以使用 Core Animation 或 SceneKit 获得更好的性能,这两者都经过了高度优化。

于 2014-12-16T00:59:45.267 回答