OSX用のオーディオプレーヤーを書いています。1 つのビューは、波形を表示するカスタム ビューです。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];
それは役に立ちますが、ライブのサイズ変更中にオーディオがまだチョークします。
これを改善する方法はありますか?
主なことは、オーディオのチョーキングを防ぐことです。