0

我正在为 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 上选择“大”显卡可以让它不那么糟糕,但也不会差很多。在实时调整大小期间,CPU 利用率约为 20-40%。
Instruments 建议重新缩放/重绘图像是问题所在。一旦我停止调整窗口大小,CPU 利用率就会下降并且音频停止故障。

我已经尝试禁用图像插值以加快绘图速度,如下所示:

[[NSGraphicsContext currentContext] 
    setImageInterpolation:NSImageInterpolationNone];

这有帮助,但在实时调整大小期间音频仍然会阻塞。

你知道如何改进吗?
主要是防止音频窒息。

4

1 回答 1

1

图形重绘不应影响音频播放。我有一个在调整窗口大小时会实时重绘的音频应用程序,以及一个用于渲染波形的后台线程,它播放音频没有问题。ioProc 读取音频数据的音频线程为实时线程,优先级高于其他大多数线程。

如果您的图形线程有锁或调用了阻塞(包括内存分配或释放)音频线程中的某些内容,则可能导致音频断断续续。多线程问题很复杂,需要处理诸如数据结构的线程安全、锁、优先级反转、阻塞等许多问题。

于 2010-03-26T06:42:31.270 回答