3

(初めて実際にここで質問するので、私のエチケットの失敗を許してください)

基本的な状況:画面内を移動できる複数の画像があります。

簡単な解決策#1
メインループはオブジェクトの配列をステップオーバーし、各オブジェクトにそれ自体を移動するように指示し、次にビューにそれ自体を更新するように指示します[self.view setNeedsDisplay]。次に、ビューは配列を取得してそれをステップオーバーし、画面上のポイントにオブジェクトを描画します。

NSArrayに200個の矢印を配置し、ここでそれらを移動する非常に単純なサンプルプロジェクト。


簡単な解決策#2
次に、オブジェクトにプロパティとしての独自のビューを持たせる実験を開始しました。

オブジェクトがメインのNSArrayに追加されると、ビューがメインの図面ビューに追加されました。[self.view addSubView:newThing.view]

メインループはオブジェクトをステップオーバーし、移動するように指示します。オブジェクトクラス内で移動すると、ビューのframe.originが移動し、その結果、メインビュー上で移動します。

これには、パーティクルエフェクトや関連するサブビューなど、必要に応じてオブジェクトが画像にサブビューを追加できるという利点もあります。

欠点は、モデルにビューのようなコードを追加しているように見え、ビューの作業の一部が隠されていることです。

ここに簡単なサンプルプロジェクトがあります。
注:両方のサンプルプロジェクトは、実際のシミュレーターで必要になると予想されるはるかに多くのものを描画しています。


私の質問?"
解決策2は、はるかに見栄えの良いコードにつながりました。簡単な分析を行うと、何千ものオブジェクトに到達するまでパフォーマンスやメモリの違いはあまりないように見えます。その後、描画バージョンでメモリのオーバーヘッドを大幅に節約できます。しかし、400個のオブジェクトであっても、それらすべてのビューを保持するための余分なメモリはそれほど多くありません。

不足しているソリューション#2を使用すべきでない理由はありますか?モデルを最終的に描画するものについて少し賢くすることで、VMCを少し「壊す」ことは問題ありませんか?

4

1 に答える 1

0

モデルオブジェクトとビューの両方を認識し、何かが変更された場合にビューに移動するように指示するオブジェクトを使用して、オブジェクトとビューの間に別のレイヤーを追加することで、MVC違反を回避できる可能性があります。

解決策2は、特にオブジェクトが多い場合に、はるかに多くのメモリとコンピューティングを必要とします。また、描画を制御しにくくなります。これは、特殊効果が必要な場合に問題になる可能性があります。このため、少なくともゲームでは、通常は使用されません。しかし、結局のところ、それが本当にあなたの人生を楽にし、あなたがパフォーマンスに満足しているなら、それを選ばない理由はありません。

それでも、CoreAnimationを見るのは良い考えかもしれません。同様のパターンを実装できますが(各オブジェクトにはビューではなく独自のレイヤーがあります)、特殊効果に対してより高速で柔軟性があります。

于 2012-05-11T16:31:11.863 に答える