【发布时间】:2011-10-04 22:01:46
【问题描述】:
我有一个NSTimer 以 60 fps 的速度射击。它更新 C++ 模型,然后通过 Quartz 2D 进行绘制。这很好用,除了内存迅速积累,即使我没有分配任何东西。 Instruments 报告没有泄漏,但似乎有很多 CFRunLoopTimers(我猜来自重复的 NSTimer?)似乎正在积累。单击窗口或按一个键会清除其中的大多数,这似乎表明自动释放池没有足够频繁地耗尽。我必须依靠事件来循环自动释放池还是有更好的方法来清除内存?
感谢任何帮助,谢谢
-山姆
定时器创建(timer 是一个 ivar):
timer = [NSTimer scheduledTimerWithTimeInterval:1.0f / 60 target:self selector:@selector(update:) userInfo:nil repeats:YES];
update:方法:
- (void)update:(NSTimer *)timer {
controller->Update();
[self.view setNeedsDisplay:YES];
}
更新:
在解决了这个问题之后,我做了一些额外的观察。
1.) [self.view setNeedsDisplay:YES] 似乎 是产生这些CFRunLoopTimers 的罪魁祸首。将其替换为 [self.view display] 可以解决问题,但会以性能为代价。
2.) 将频率降低到 20-30 fps 并保持 `[self.view setNeedsDisplay:YES]' 也会导致问题消失。
这似乎暗示setNeedsDisplay: 不喜欢被调用很多(也许每秒更多的时间然后可以显示?)。如果它所做的只是告诉在事件循环结束时重新显示视图,我坦率地无法理解“过度调用”它的问题。
我确信我在这里遗漏了一些东西,非常感谢任何额外的帮助。
【问题讨论】:
-
你能贴出你创建定时器的代码和你的定时器事件的代码吗?
标签: objective-c memory nstimer autorelease