LayerはModelである

Core Animation Programming Guideを読んでいたら、面白いことがわかった。ちょうどCore Animation Rendering Architectureのところなので、興味があったら直接覗いてほしい。

CocoaアプリケーションのデザインパターンはMVC(Model – View – Controller)が使われているので、アプリケーションを開発するときには少なからずこれを意識する必要がある。Core AnimationはCocoaではないが、Cocoaから利用する事が最も多いと思われるので、Core Animationも当然MVCの例外ではないようだ。

ところで、私が今見ている限りCore Animationは、Layer,Animation,Actionで主に構成されているようだ。Layerに描画し、それをAnimationでアニメートさせる、そしてActionだが、これは私も今調べている途中である。LayerはNSViewと同じような構造をしていて、木構造を作る事ができるが、zPositionを指定できるので、表示する際の順番を木構造に反映する必要はない。Core Animationを使うときには、ひとつルートになるLayerを作成し、それに他のLayerを貼付けていき、ルートLayerをNSViewなどに設定する事で実際に表示させる事ができる。このあたりの流れは、この前の記事(Core Animationしてみた)を参照してほしい。

このLayerであるが、MVCで言ったらどれにあたるだろうか?これについてCore Animation Rendering Architectureに書かれているのだ。これを見ると、LayerはViewと思いきや、実はModelだと言う事がわかる。

While there are obvious similarities between Core Animation layers and Cocoa views the biggest conceptual divergence is that layers do not render directly to the screen.

Where NSView is clearly a view object in the model-view-controller design pattern, Core Animation layers are actually model objects. They encapsulate geometry, timing and visual properties, and they provide the content that is displayed, but the actual display is not the layer’s responsibility.

どうやらプログラミングで直接使うLayer-Treeの他に、内部的にあと二つの全く同じ構造のLayerが作成されていて、一つは実際に描画するためのRender-Tree、もう一つはRender-TreeとLayer-TreeをつなぐためのPresentation-Treeが存在するようである。Render-Treeはアプリケーションから独立したスレッドで実行され、アニメーションの責任と、アプリケーション実行ループに影響を与えないようになっている。また、Render-TreeはPresentation-Treeの値をもとに描画を行う。Presentation-Treeは、Layer-Treeの値を常に監視しているわけではなく、実際に描画で必要な値だけをLayer-Treeから取ってくるらしい。

この結果、Core Animationは何百ものLayerを扱う事ができるというわけだ。まだ使った事ないけど…

コメント投稿