首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确停止并恢复CADisplayLink?

如何正确停止并恢复CADisplayLink?
EN

Stack Overflow用户
提问于 2011-12-07 02:22:46
回答 5查看 12K关注 0票数 16

我发现了CADisplayLink的一个大问题。

我有一个最基本的EAGLLayer,用OpenGL ES1.1绘制一个旋转三角形进行测试。这需要以屏幕刷新速率调用run循环方法,因此我开始运行循环,如下所示:

代码语言:javascript
运行
复制
- (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。

  • 第一个开始/停止周期总是以100%的速度执行。我得到最大帧速率。
  • 所有后续的启动/停止周期只显示大约80%的性能。我的帧速率要小得多。但是:总是几乎完全相同,+/- 2帧。即使在再进行50次启动/停止周期之后,也没有进一步退化的趋势。

的结论是:像我前面所做的那样,创建一个CADisplayLink很好,直到它失效或暂停为止。在那之后,任何新的CADisplayLink都不再表现良好。即使它是以与以前完全相同的方式创建的。如果我通过调用带有YES / NO的-setPaused:方法来暂停/恢复它,情况也是如此。

我已经确保分配和VM跟踪器设备没有内存管理问题。我还检查了是否真的调用了CADisplayLink的CADisplayLink方法。

设备上的iOS 4.0 (iPhone 4)。

为什么会这样呢?我是不是遗漏了什么?

EN

回答 5

Stack Overflow用户

发布于 2015-09-22 10:57:16

我认为你真正想要的只是暂停和取消你的显示链接。

代码语言:javascript
运行
复制
 - (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;
}
票数 10
EN

Stack Overflow用户

发布于 2015-07-16 18:58:50

我在用

代码语言:javascript
运行
复制
[displayLink removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

看看它对你有用吗

票数 5
EN

Stack Overflow用户

发布于 2018-12-17 09:47:29

Swift 4.2

代码语言:javascript
运行
复制
displayLink.remove(from: RunLoop.current, forMode: RunLoop.Mode.common)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8409656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档