我正在为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% 仪器建议重新缩放/重绘图像是个问题。一旦我停止调整窗口大小,CPU利用率就会下降,音频会停止出现故障。
我已经尝试禁用图像插值来加速绘图,如下所示:
[[NSGraphicsContext currentContext]
setImageInterpolation:NSImageInterpolationNone];
这有帮助,但在实时调整大小时音频仍然会窒息。
你知道如何改善这个吗? 主要是防止音频窒息。
答案 0 :(得分:1)
图形重绘不应影响音频播放。我有一个音频应用程序,在调整窗口大小时进行实时重绘,以及渲染波形的后台线程,并且播放音频没有问题。读取音频数据的ioProc的音频线程是实时线程,并且具有比大多数其他线程更高的优先级。
如果您的图形线程有锁或调用某些内容阻止(包括内存分配或释放)音频线程中的内容,则可能导致音频断断续续。多线程问题很复杂,存在诸如数据结构的线程安全性,锁定,优先级倒置,阻塞以及许多其他需要处理的问题。