0

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];

それは役に立ちますが、ライブのサイズ変更中にオーディオがまだチョークします。

これを改善する方法はありますか?
主なことは、オーディオのチョーキングを防ぐことです。

4

1 に答える 1

1

グラフィックスの再描画がオーディオの再生に影響を与えることはありません。ウィンドウのサイズを変更するときにライブ再描画を行うオーディオ アプリと、波形をレンダリングするバックグラウンド スレッドがあり、オーディオの再生に問題はありません。オーディオ データを読み取る ioProc が実行するオーディオ スレッドは、リアルタイム スレッドであり、他のほとんどのスレッドよりも優先度が高くなります。

グラフィックス スレッドにロックがあるか、オーディオ スレッド内の何かをブロックする (メモリの割り当てや解放を含む) 何かを呼び出すと、オーディオが途切れる可能性があります。マルチスレッドの問題は複雑で、データ構造のスレッド セーフ、ロック、優先順位の逆転、ブロックなど、対処すべき多くの問題があります。

于 2010-03-26T06:42:31.270 に答える