我发现了CADisplayLink的一个大问题。
我有一个最基本的EAGLLayer,用OpenGL ES1.1绘制一个旋转三角形进行测试。这需要以屏幕刷新速率调用run循环方法,因此我开始运行循环,如下所示:
- (void)startRunloop {
if (!animating) {
CADisplayLink *dl = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)];
[dl setFrameInterval:1.0];
[dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
self.displayLink = dl;
animating = YES;
}
}
- (void)stopRunloop {
if (animating) {
[self.displayLink invalidate];
self.displayLink = nil;
animating = NO;
}
}
当测试应用程序启动时,我调用-startRunloop。当我点击屏幕时,我打电话给-stopRunloop。当我再次点击时,我打电话给-startRunloop。以此类推。乒乓球。
我正在测量在20秒内调用-drawFrame方法的频率,并对其进行NSLog。
的结论是:像我前面所做的那样,创建一个CADisplayLink很好,直到它失效或暂停为止。在那之后,任何新的CADisplayLink都不再表现良好。即使它是以与以前完全相同的方式创建的。如果我通过调用带有YES / NO的-setPaused:方法来暂停/恢复它,情况也是如此。
我已经确保分配和VM跟踪器设备没有内存管理问题。我还检查了是否真的调用了CADisplayLink的CADisplayLink方法。
设备上的iOS 4.0 (iPhone 4)。
为什么会这样呢?我是不是遗漏了什么?
发布于 2015-09-22 10:57:16
我认为你真正想要的只是暂停和取消你的显示链接。
- (void)createRunloop {
CADisplayLink *dl = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)];
[dl setFrameInterval:1.0];
[dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
self.displayLink = dl;
// start in running state, your choice.
dl.paused = NO;
}
- (void)startRunloop {
self.displayLink.paused = NO;
}
- (void)stopRunloop {
self.displayLink.paused = YES;
}
- (void)destroyRunloop {
[self.displayLink invalidate];
self.displayLink = nil;
}
发布于 2015-07-16 18:58:50
我在用
[displayLink removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
看看它对你有用吗
发布于 2018-12-17 09:47:29
Swift 4.2
displayLink.remove(from: RunLoop.current, forMode: RunLoop.Mode.common)
https://stackoverflow.com/questions/8409656
复制相似问题