gpt4 book ai didi

iphone - 如何正确停止和恢复 CADisplayLink?

转载 作者:技术小花猫 更新时间:2023-10-29 10:34:48 27 4
gpt4 key购买 nike

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

我有最基本的 EAGLLayer 和 OpenGL ES 1.1 绘制一个旋转三角形用于测试。这需要一个以屏幕刷新率调用的运行循环方法,所以我这样启动运行循环:

- (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。等等。乒乓球。

我正在测量 -drawFrame 方法在 20 秒内被调用的频率,并对它进行 NSLog。

  • 第一个启动/停止周期始终以 100% 执行。我获得了最大帧速率。

  • 所有后续启动/停止周期仅显示大约 80% 的性能。我得到的帧率要小得多。但是:总是几乎完全相同,+/- 2 帧。即使在 50 个以上的启动/停止循环后也没有进一步退化的趋势。

结论:像我上面那样创建一个 CADisplayLink 很好,直到它失效或暂停。之后,任何新的 CADisplayLink 都无法正常运行。即使它是新创建的,并且与以前的方式完全相同。如果我通过使用 YES/NO 调用 -setPaused: 方法来暂停/恢复它,情况也是如此。

我已经使用分配和 VM 跟踪工具确保没有内存管理问题。我还检查了 CADisplayLink 的 -invalidate 方法是否真的被调用了。

设备 (iPhone 4) 上的 iOS 4.0。

这是为什么呢?我错过了什么吗?

最佳答案

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

 - (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;
}

关于iphone - 如何正确停止和恢复 CADisplayLink?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8409656/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com