1

私は Qt ベースの MacOS/X オーディオ メータリング アプリケーションに取り組んでいます。これにはオーディオ メータリング ウィジェット (多くの可能性があります) が含まれており、それぞれが 50ms ごとに (つまり 20Hz で) 更新されるはずです。

プログラムは動作しますが、一度に多数のメーターが更新されると、CPU 時間が大量に消費され、動きが鈍くなる可能性があります (スピニー カラー ホイール、なんてこった!)。

奇妙なことに、このアプリは元々、メーターの値が変更されるたびにメーター ウィジェットで update() を呼び出すだけだったため、メーター ウィジェット全体が 50 ミリ秒ごとに再描画されていました。ただし、私は賢く、実際に再描画する必要があるメーターの領域だけを計算し、ウィジェットのその部分のみを再描画すると考えました (たとえば、y と h が update(x,y,w,h) の場合)。メーターの古い値と新しい値に基づいて計算されます)。しかし、私がそれを実装すると、実際には CPU 使用率が 4 倍になりました (!)... アプリが毎秒 50% 少ないピクセルを描画していたにもかかわらず。

この最適化が実際にペシミゼーションになる理由を誰か説明できますか? ここに、効果を示す簡単なサンプル アプリケーションを投稿しました。

http://www.lcscanada.com/jaf/meter_test.zip

上記のアプリをコンパイル (qmake;make) し、次のように実行すると:

$ ./meter.app/Contents/MacOS/meter 72 
Meter:  Using numMeters=72 (partial updates ENABLED)

... top は、~50% の CPU を使用しているプロセスを示しています。

次のように実行して、巧妙な部分更新ロジックを無効にすると、次のようになります。

$ ./meter.app/Contents/MacOS/meter 72 disable_partial_updates
Meter:  Using numMeters=72 (partial updates DISABLED)

... top は、~12% の CPU しか使用していないプロセスを示しています。は?この場合、より多くの CPU を使用するべきではありませんか?

Shark を使用してアプリのプロファイリングを試みましたが、結果はあまり意味がありませんでした。FWIW、私は 8 コアの Xeon Mac Pro で Snow Leopard を実行しています。

4

2 に答える 2

2

GPU 描画は、再描画する部分を CPU に計算させるよりもはるかに高速です (少なくとも OpenGL の場合、これは考慮されます。Book OpenGL の優れたものを入手しました。これは、OpenGL は再描画ではなくデルタを描画するように構築されていると述べています。やるべきことはもっとたくさんあります)。ソフトウェア レンダリングを使用している場合でも、ライブラリは適切かつ高速に機能するように高度に最適化されています。したがって、再描画だけが最先端です。

于 2010-02-23T00:13:11.883 に答える
1

私のLinuxボックスのFWIWtopは、部分的な更新なしで〜10〜11%、部分的な更新を使用して12%を示しています。ただし、その CPU 使用率を取得するには 400 メートルを要求する必要がありました。

おそらく、ペイント領域を設定する Qt のオーバーヘッドが実際にペイント時間を小さくしているだけなのでしょうか? 結局のところ、ペイントは非常に単純で、2 つの長方形の塗りつぶしだけです。

于 2010-02-22T21:55:24.727 に答える