Как ускорить рисование масштабированного изображения? Аудио воспроизведение дросселирует во время изменения размера окна - PullRequest
0 голосов
/ 24 марта 2010

Я пишу аудиоплеер для 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];

Это помогает, но звук по-прежнему заглушается при изменении размера в реальном времени.

У вас есть идея, как это улучшить?
Главное, чтобы звук не задыхался.

1 Ответ

1 голос
/ 26 марта 2010

Перерисовка графики не должна влиять на воспроизведение звука. У меня есть аудио-приложение, которое выполняет перерисовку в реальном времени при изменении размера окна, а также фоновый поток для рендеринга сигнала, и у него нет проблем с воспроизведением звука. Аудиопоток, который считывает аудиоданные ioProc, представляет собой поток в реальном времени и имеет более высокий приоритет, чем большинство других потоков.

Если ваш графический поток имеет блокировку или вызывает что-то, что блокирует (включая выделение памяти или освобождение) что-то в аудиопотоке, это может вызвать заикание звука. Проблемы многопоточности являются сложными, с такими проблемами, как безопасность потоков в структурах данных, блокировки, инверсия приоритетов, блокировка и многое другое.

...