2009-07-20 3 views
2

私はKVO/KVCの巨大なファンになった。私はそれが私のMVCアーキテクチャをきれいに保つ方法が大好きです。しかし、3Dレンダリングアプリケーションの内部レンダリングループ内でKVOを使用したときに発生する巨大なパフォーマンスヒットには夢中ではありません。私は、メッセージが観測対象のオブジェクトごとに60回/秒で発生する場所を設計しています。ココアタッチプログラミング。内側ループのKVO/KVCは超低速である。どのように物事をスピードアップするのですか?

KVOのスピードアップのヒントは何ですか?具体的には、私はオブジェクトではなくスカラー値を観察しているので、おそらくラッピング/アンラッピングが私を殺しています。私はまた、観測を設定し、解体しています。内側のループ内に、観測結果を表示して破棄しています。

[foo addObserver:bar forKeyPath:@"fooKey" options:0 context:NULL]; 
[foo removeObserver:bar forKeyPath:@"fooKey"]; 

おそらく私はそれを打つつもりです。

私は実際に、KVOが私に提供する大きな柔軟性を維持したいと考えています。手を貸すことができるスピードはどこにある?

乾杯、 ダグ

+0

パフォーマンスヒットがKVO/KVCによって引き起こされたことをどのように知っていますか?プロファイルしましたか?答えがうかがえる場合は申し訳ありませんが、時には人々はパフォーマンスのボトルネックについての仮定を取っています... – zoul

+0

私は宗教的にプロファイルします。私の心は、パフォーマンスがKVOでクロールに疲れたときに沈んだ。うん – dugla

答えて

4

のObjective-Cのメッセージディスパッチおよびその他の機能が調整されており、かなり速いそれらが提供する、しかし、彼らはまだ計算タスク用にチューニングCの電位が近づいていないもののために:

NSNumber *a = [NSNumber numberWithIntegerValue:(b.integerValue + c.integerValue)]; 

は、より道遅い:

NSInteger a = b + c; 

と誰もが実際にいることも(その理由でのObjective-Cでのオブジェクトの上に数学もしません構文はひどいです)。

Objective-Cの強力な機能は、高価なビットを捨てて、必要なときに純粋なCを使うことができる、表現力豊かなメッセージベースのオブジェクトシステムです。 KVOは高価なビットの1つです。私はKVOが大好きです。私はいつも使っています。特に多くの観測対象がある場合は、計算コストが高くなります。

内側のループは、何度も何度も何度も繰り返し実行するコードの小さなビットです。必要に応じてOOPの機能を削除する必要がある場所、メモリを割り当てるべきでない場所、メソッド呼び出しを静的なインライン関数に置き換えることを検討する必要がある場所です。たとえ何らかの形でレンダリングループで受け入れ可能なパフォーマンスを得ることができたとしても、高価な通知とディスパッチロジックをすべてそこから取得した場合よりもパフォーマンスが大幅に低下します。自動からあなたのオブジェクト内のマニュアルKVOへ

  1. スイッチ:

    あなたは本当にそれがここにKVOを続けるために試してみたい場合は、いくつかのあなたは物事がより速く行かせることを試みることができものです。これにより、偽の通知を減らすことができます

  2. 集計更新:ある時間間隔の中間値が関係なく、ある程度の時間(次のアニメーションフレームのように)延期することができます。変更がポストされ、関連タイマーがオフになるのを待つ必要がある場合は、短命の中間更新を避けることができます。いくつかの種類のプロキシを使用して、複数のオブジェクト間で関連する変更を集約することもできます。
  3. observableプロパティをマージする:あるタイプのオブジェクトに多数のプロパティがある場合は、変更する可能性があります。単一の "hasChanges"プロパティを観察し、オブザーバにプロパティをクエリさせる方がよい場合があります。
+0

Louis、 KVOを放棄したくないのは、クリーンなMVCアーキテクチャを維持することです。私は自分のモデルで起こっている行動を観察しています。ここに典型的な例があります:スプライトの束が画面の周りをジップして、サウンドエフェクトを非常にきめ細かいレベルで関連付けることができます。私はKVOのメッセージングと2つのブリッジを完全に分離したサウンドライブラリにサウンドをロードしたいと思います。スピードのペナルティは、それほど理想的ではないスプライトエンジンに音を引き込ませます。 – dugla

+0

あなたが実際にできるようにしたいのであれば、あなたができることがいくつかあります。私はそれらを投稿に追加しましたが、モデルとビューの間のブレークから少しはずれてしまうかもしれません。 –

+0

アシストルイスに感謝します。乾杯。 – dugla

関連する問題