【发布时间】:2014-12-15 22:32:30
【问题描述】:
我问了一个更笼统的问题,关于CADisplayLink 和drawRect 的行为here,但由于这个问题还没有任何答案,我想我会问一个更具体的问题:有没有人设法通过 drawRect 方法让应用以 60fps 的速度运行,执行时间约为 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-11 毫秒,但我认为给定 1/60fps = 16.7 毫秒,这应该没问题。
有人做到了吗?我做错了什么?
【问题讨论】:
-
从您的描述看来,您所做的一切都是正确的。在理想情况下 60 fps 是不错的,但即使是原生 Apple UI 元素也会下降到 40-50 fps,例如在快速滚动表格视图时。
-
另外,我认为您可能已经在这样做了,但是在
drawRect:中,请确保您使用的是displayLink.timestamp中的增量(而不是一些硬编码的增量,例如 5 个点)来计算你的动作。 -
问题是,当更新方法花费的时间稍微过长时,显示链接会错过下一次触发,并且帧速率会下降到 30fps。
-
是的,我正在使用增量。当帧率在 60 到 30fps 之间跳跃时,它看起来仍然很糟糕。我只是不明白为什么我不能在帧之间使用完整的 16 毫秒。
标签: ios uiview cadisplaylink