キャッシュ

キャッシュ

このようなノードについて考えます。

1. 描画ノード
2. └ トランスフォームノード
3.   └ エフェクトノード
4.     └ 図形ノード

エフェクトノード内

3-1. 縁取り
3-2. ドロップシャドウ (アニメーションあり)

トランスフォームノード、図形ノードはアニメーションなし。

結論から言うと、 この例では数フレーム描画されると、 Beutlはエフェクトノード内の3-1までをキャッシュします。
以下でなぜそうなるのかを説明します。

キャッシュ可能かの判断

3フレーム以上同じ状態だとキャッシュ可能と判断します。

そのカウント方法は2つあります。

  1. 自動カウント このカウント方法はノードが不変である必要がありますが、非常に簡単です。 描画時にカウントして、ノードが変わるとカウントをゼロにします。 このカウントが3以上になるとキャッシュ可能と判断します。

  2. 手動カウント この方法はISupportRenderCacheを実装したノードに対して有効です。 これを実装したノードは前回のフレームと比べてどこまで同じだったかを報告します。 直近の3フレームのどこまで同じだったかの値の最小値が1以上のとき、キャッシュ境界可能、 直近の3フレームがすべて同じとき、キャッシュ可能と判断します。

     -> フレーム
     1 2 3 4
3-1. ■ ■ ■ ■
3-2. ○ ● ○ ●

この場合、最初のフレーム以外1/2を報告します。

4フレーム目が描画されたあとにキャッシュ境界可能と判断します。

NOTE

キャッシュ境界となるノードよりも祖先にあるノードはキャッシュできません。

ノードが「キャッシュ境界可能またはキャッシュ可能」かつ、 すべての子要素がキャッシュ可能である場合、 そのノードの描画内容をキャッシュします。

ISupportRenderCacheでの手動制御

ISupportRenderCacheを実装するノードはキャッシュするかのフラグ、 キャッシュの保存処理、キャッシュを使用した描画処理を手動で制御できます。

これは複数のエフェクトをその途中までキャッシュできるようするため、 エフェクトノードで実装しています。

GitHub LogoGitHubで表示この記事のソースはGitHubにあります。<br />改善点があればIssueやPull requestを開いてください。