Мой класс отображает изображения вне экрана. Я думал, что повторно использовать CGContext
вместо того, чтобы создавать один и тот же контекст снова и снова для каждого изображения, было бы хорошо. Я установил переменную-член _imageContext
, поэтому мне нужно было бы создать новый контекст, если _imageContext
равен нулю:
if(!_imageContext)
_imageContext = [self contextOfSize:imageSize];
вместо:
CGContextRef imageContext = [self contextOfSize:imageSize];
Конечно, я больше не выпускаю CGContext
.
Это единственные изменения, которые я сделал, получается, что повторное использование контекста замедляло рендеринг от примерно 10 мс до 60 мс. Я что-то пропустил? Должен ли я очистить контекст или что-то еще, прежде чем в него вставлять? Или это правильный способ воссоздать контекст для каждого изображения?
ИЗМЕНИТЬ
Найдено самое странное соединение..
В то время как я искал причину, по которой приложение быстро растет, когда приложение начинает рендеринг изображений, я обнаружил, что проблема заключается в том, где я устанавливаю отображаемое изображение на NSImageView
.
imageView.image = nil;
imageView.image = [[NSImage alloc] initWithCGImage:_imageRef size:size];
Похоже, что ARC не выпускает предыдущий NSImage
. Первый способ избежать этого - нарисовать новое изображение в старом.
[imageView.image lockFocus];
[[[NSImage alloc] initWithCGImage:_imageRef size:size] drawInRect:NSMakeRect(0, 0, size.width, size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
[imageView.image unlockFocus];
[imageView setNeedsDisplay];
Проблема с памятью исчезла и что случилось с проблемой CGContext
-reuse?
Не повторное использование контекста теперь занимает 20 мс вместо 10 мс - конечно, рисование в изображение занимает больше времени, чем просто его установка.
Повторное использование контекста также занимает 20 мс вместо 60 мс. Но почему? Я не вижу, что может быть какая-либо связь, но я могу воспроизвести старое состояние, в котором повторное использование занимает больше времени, просто установив NSImageView
изображение вместо его рисования.