ビューの背景を描画する際のベスト プラクティスは何ですか? NSColor と NSRectfill を使用するか、CGColorRef や CGContextSetFillColorWithColor などの Core Foundation オブジェクトを使用しますか? コア基盤オブジェクトを使用すると、パフォーマンス上の利点はありますか?
1 に答える
考慮すべき要因
使いやすさ
を含む AppKit 描画 API は、NSRectFill
渡すものが少ないため、一般的に簡単です。また、CGColors よりも NSColors を作成する方が簡単です ( white と blackの外側)。
スレッドセーフ
AppKit API を使用してコンテキストを渡さないため (すべての描画は現在のコンテキストに移動します)、メイン スレッド以外のスレッドで AppKit 描画を安全に行う方法はありません。
また、AppKit 由来のコンテキストで CG 描画を行うべきではありません。別のスレッドで描画する場合は、独自のコンテキストを作成し、後でそこから画像をキャプチャし、ディスパッチまたはメイン スレッドの実行を使用してメイン スレッドにスローします。
パフォーマンス上の利点
ゼロと仮定します。
描画の高価な部分は描画です。影が最も大きく、次にラスタライズ パス (特にテキストを含む) が続きます。ラスター (CGImage や NSBIR など) の合成は、予想よりも高速です。
比較すると、NS* 描画 API から CG* への切り替えは微視的です。Instruments での調査結果に従って、最適化の時間を別の場所に費やしてください。
このような変更を行う価値がある唯一の場所は (当然のことながら) テキストです。Core Text は、AppKit のテキスト描画よりも小さいながら測定可能な速度で実行できます。いずれかの最適なケースは、保持して再利用できる不変の文字列です。コア テキストの場合、フレームセッターおよび/またはフレームを保持します。AppKit 描画では、属性付きの文字列のみを保持できます。文字列が頻繁に変更される場合は、何もありません。いずれにせよ、それを描画するとコストがかかるだけです。ただし、ここでも最初にプロファイリングを行い、それがアプリで重要であることが証明されるまで、これについて心配する必要はありません。
携帯性
CG コードは、ほとんどまたはまったく変更することなく、Mac と iOS の両方で使用できます。AppKit 描画コードは、AppKit が存在する場所 (Mac) でのみ機能します。
評決
iOS に移植する (または既存の iOS バージョンを維持する) 場合を除き、AppKit 描画を使用します。その場合は、Core Graphics を使用し、両方で可能な限り多くの描画コードを再利用します。
(もちろん、コードが両方のプラットフォームで同じものを描画すると仮定します。それぞれで異なる方法で描画する場合、それは単に 2 つの別個のコードのかたまりである必要があります。この場合、それぞれがプラットフォーム固有の API を使用できます。とにかくプラットフォーム固有です。)