11

Windows Vista/7 ボリューム コントロールのちらつきの問題のデバッグに関する Larry Osterman の最新のブログ記事を読んでいたときに、OS X ラップトップでアプリケーションのちらつきを見たことがないことに突然気付きました。私の経験では、そうでなければ不十分に書かれているように見えるアプリケーションでさえ、ちらつきの問題を回避できます。これが Apple 対 Windows の議論に発展しない限り (お願いします)、なぜ OS X アプリケーションには同じちらつきの問題がないように見えるのでしょうか?

Apple の開発者がちらつきのない GUI をプログラミングすることに単に驚くほど優れているのに、Windows のプログラマーは頭が悪いとは信じられません。では、その理由は何ですか? OS X API では、すべての GUI でダブルバッファリングを実装する必要がありますか? 一部のアプリでは、ダブル バッファリングのサイズ変更動作がわずかに遅くなりますが、多くのアプリではそうではなく、ちらつきも回避されます。OS X の再描画フローは Windows とは根本的に異なり、WM_ERASEBKGRND問題を完全に回避しているのでしょうか? それとも、私が見ていない他の可能性はありますか?

更新: ご回答ありがとうございます。どちらも役立つので、ken と cb160 の両方の回答を選択できればと思います。

4

3 に答える 3

17

Mac OS X にはダブル バッファ ウィンドウがあります

それを実現するために何もする必要はありません。舞台裏です。

何かが変更されたときに (ほとんどの場合) Cocoa のウィンドウに明示的に描画するのではなく、ウィンドウの領域を無効にします。フレームワークは後でビューの階層を下って、ウィンドウのダーティ リージョンをセカンダリ バッファーに描画します。次に、バッファをスワップします。

必要に応じて、再描画時にフレームワークがショートカットを取ることを許可するいくつかの約束をすることができますが、それらはすべてオプトインです。経験豊富なビューのみが影響を受けます。

NSView のサブクラスがisOpaqueYES を返すメソッドを実装している場合、フレームワークはビューの背後にあるものをクリアしたり、その下にあるビューを描画したりしません。

preservesContentDuringLiveResizeYES を返すように実装すると、追加の責任が生じますが、ウィンドウのサイズ変更中のパフォーマンスを向上させることができます。

layerContentsRedrawPolicy10.6 では、この種の新しい API がさらに 2 つ追加されましたlayerContentsPlacement

最後に、カスタム描画は Windows ほど一般的ではありません。表示されるビューの大部分は、フレームワークによって提供され、サブクラス化されていません。フレームワーク提供とは、Apple による最適化を意味します。

于 2009-09-17T07:11:37.540 に答える
11

Windows Vista/7 と OSX はどちらも合成エンジンを使用して、ラスター化されたビットマップを画面に描画します。これらの合成エンジンは、すべてのウィンドウからの出力を処理し、最終的な画面イメージを描画します。この合成アプローチは、OSX がドックに最小化するときに魔神効果をどのように使用できるか、および aero が半透明の境界線をどのように描画するかです。また、画面の特定の領域を埋めるビットマップが利用できないかのようにちらつきを防ぎます。空白の領域を描画するのではなく、既にある画像を使用します。

OSX には、最初の出荷時から合成エンジンが搭載されています。当時出荷されていたすべてのビデオ カードは合成画像ではなくビットマップ (つまり、ウィンドウのボタンと境界線) を描画するように最適化されていたため、多くの人はこれはクレイジーなアプローチでした。OSX の新しいバージョンでは、合成は GPU (Quartz Extreme 内) にプッシュされたため、CPU の負荷が大幅に軽減され、より多くの効果が可能になりました。

Windows コンポジターは Windows Vista でのみ追加され、利用可能な GPU があり、適切なバージョンの OS がある場合にのみ追加されたため、OSX の Quartz コンポジターほど普及していません。コンポジットは Windows で常に使用されるとは限らないため、領域が空白になるとちらつきが発生し、描画を担当するアプリケーションは領域を十分に迅速に再描画できません。

于 2009-09-17T07:52:30.883 に答える