Я пишу аудиоплеер для OSX. Один вид - это пользовательский вид, отображающий форму волны. Сигнал сохраняется как переменная экземпляра типа NSImage
с NSBitmapImageRep
. В представлении также отображается индикатор прогресса (толстая красная линия). Поэтому он обновляется / перерисовывается каждые 30 миллисекунд.
Поскольку пересчет изображения занимает довольно много времени, я делаю это в фоновом потоке после изменения размера каждого окна и обновляю отображаемое изображение, как только новое изображение будет готово. В то же время исходное изображение масштабируется, чтобы соответствовать виду:
// The drawing rectangle is slightly smaller than the view, defined by
// the two margins.
NSRect drawingRect;
drawingRect.origin = NSMakePoint(sideEdgeMarginWidth, topEdgeMarginHeight);
drawingRect.size = NSMakeSize([self bounds].size.width-2*sideEdgeMarginWidth,
[self bounds].size.height-2*topEdgeMarginHeight);
[waveform drawInRect:drawingRect
fromRect:NSZeroRect
operation:NSCompositeSourceOver
fraction:1];
Вид составляет большую часть окна. Во время изменения размера звук начинает подавляться. Выбор «большой» графической карты на моем Macbook Pro делает ее менее плохой, но не намного. При изменении размеров в реальном времени загрузка процессора составляет где-то около 20-40%.
Инструменты предполагают, что проблема заключается в изменении масштаба / перерисовке изображения. Как только я прекращаю изменять размер окна, загрузка ЦП снижается, и звук перестает зависать.
Я уже пытался отключить интерполяцию изображения для ускорения рисования следующим образом:
[[NSGraphicsContext currentContext]
setImageInterpolation:NSImageInterpolationNone];
Это помогает, но звук по-прежнему заглушается при изменении размера в реальном времени.
У вас есть идея, как это улучшить?
Главное, чтобы звук не задыхался.