我正在为 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];
这有帮助,但在实时调整大小期间音频仍然会阻塞。
你知道如何改进吗?
主要是防止音频窒息。