У меня NSTimer
стрельба со скоростью 60 кадров в секунду.Он обновляет модель C ++, а затем рисует через Quartz 2D.Это работает хорошо, за исключением того, что память быстро накапливается, хотя я ничего не выделяю.Приборы не сообщают об утечках, но многие CFRunLoopTimers
(я думаю, из повторяющихся NSTimer
?), Похоже, накапливаются.Щелчок по окну или нажатие клавиши удаляет большинство из них, что, по-видимому, указывает на то, что пул авто-выпусков не достаточно часто сливается.Нужно ли полагаться на события для циклического пула (-ов) автоматического выпуска или есть лучший способ очистить память?
Любая помощь приветствуется, спасибо
-Sam
Создание таймера (timer
- это ивар):
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 кадров в секунду и сохранение `[self.view setNeedsDisplay: YES] 'также вызываетпроблема исчезнет.
Это может означать, что setNeedsDisplay:
не нравится, когда его часто называют (может быть, больше времени в секунду, чем может отображаться?).Я, честно говоря, не могу понять, в чем проблема с «перезвоном», если все, что он делает, это говорит, что представление отображается повторно в конце цикла событий.
Я уверен, что здесь чего-то не хватает, и любая дополнительная помощь очень ценится.