我已经问了一个关于CADisplayLink
和drawRect
如何表现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这应该没问题。
有没有人实现这个目标?我做错了什么?
答案 0 :(得分:4)
我只是不明白为什么我不能在帧之间使用完整的16ms
除了您正在处理的一个视图外,屏幕刷新时会绘制其他内容。 (例如,状态栏时钟。)此外,drawRect:
中的任何内容都不是硬件加速的。因此,一些计算能力正在做其他事情(后台下载,iCloud同步等)
使用drawRect:
,你永远无法可靠地获得60fps。您可以尝试使用缓存和Apple的其他drawing tips来提高性能。使用Core Animation或SceneKit也可以获得更好的性能,这两者都是高度优化的。