60 Гц NSTimer и автоматически освобожденная память

У меня есть NSTimer , стреляющий со скоростью 60 кадров в секунду. Он обновляет модель C ++, а затем рисует через Quartz 2D. Это работает хорошо, за исключением того, что память быстро накапливается, хотя я ничего не выделяю. Instruments не сообщает об утечках, но многие CFRunLoopTimer (я полагаю, исходя из повторяющегося NSTimer ?), Похоже, накапливаются. Щелчок по окну или нажатие клавиши удаляет большинство из них, что, казалось бы, указывает на то, что пул с автозапуском не сливается достаточно часто. Должен ли я полагаться на события для цикла автозапуска пула (ов) или есть лучший способ очистить память?

Любая помощь приветствуется, спасибо

-Sam

Создание таймера ( timer - это ivar):

timer = [NSTimer scheduledTimerWithTimeInterval:1.0f / 60 target:self selector:@selector(update:) userInfo:nil repeats:YES];

update: method:

- (void)update:(NSTimer *)timer {
    controller->Update();
    [self.view setNeedsDisplay:YES];
}

Update:

Поработав с этим еще немного, я сделал несколько дополнительных наблюдений.

1. ) [self.view setNeedsDisplay: YES] кажется виновником создания этих CFRunLoopTimers . Замена на [self.view display] устраняет проблему, но за счет снижения производительности.

2.) Снижение частоты до 20-30 кадров в секунду и сохранение `[self.view setNeedsDisplay: YES] 'также устраняет проблему.

Это может означать, что setNeedsDisplay: не любит, когда его часто вызывают (может быть, больше времени в секунду может отображаться?). Честно говоря, я не могу понять, в чем проблема с "перевызыванием", если все, что он делает, - это повторное отображение представления в конце цикла событий.

Я уверен, что здесь чего-то не хватает, и мы будем благодарны за любую дополнительную помощь.

6
задан Sam 16 July 2011 в 07:59
поделиться