2016-07-29 3 views
0

ライブビューを別のNSViewのように見せようとしています。2つのNSViewのレンダリングされたコンテンツをどのように同期させるべきですか?

私の問題は、ではありません。 cocoa: how to render view to image?


のは、インシデントビュー、多くの先の景色、ミラービューに1をソースビューを呼ぶことにしましょう。

すべてのビューには、エクスポートとインポートのCGLayerがあります。

エクスポートレイヤーは、インシデントビューとして機能します。

インポートレイヤーは、ミラービューとして機能します。

アイデアはインシデントビューが自分mrrSurfaceにその反射をキャッチしますncdntReflectionとそのミラービューのすべてをキャストすることです。

  • ncdntReflection:インシデントビューの輸出CGLayer。
  • mrrSurface:ミラービューのインポートCGLayer。

私は今のところ...

1.バッキングストアとしてCGLayer 3つのアプローチを試してみた:

  1. インシデントビューとそのサブビューに内容を描きますncdntReflection
  2. ドローncdntReflectionインシデントビューの現在のコンテキスト。
  3. 設定ミラービュー(S) ncdntReflectionへのmrrSurface。 CGLayerへ

2.コンポジットCALayers

  1. ncdntReflectionインシデントビューとそのサブビューのドローバックCALayers。
  2. 設定ミラービュー(S) ncdntReflectionへのmrrSurface

3. cacheDisplayInRectまたはCGWindowListCreateImage

  1. キャプチャ
  2. ncdntReflectionにそれらの内容を描画する方法のいずれかを使用してインシデントビューの内容。
  3. 設定ミラービュー(S) ncdntReflectionへのmrrSurface

私は以下の理由でこれらのアプローチのいずれも好きではありませんでした。

レイヤーの折りたたみはオプションではありません。各レイヤーにアニメーションが必要です。つまり、すべてのサブビューを取得するには、オプション1と2の両方を再帰的に実行する必要があります。私は、この種の描画のパフォーマンスが心配です。

オプション3は、実際のソリューションには長すぎます。 WPFビジュアルブラシのような -

理想的には、両方のインシデントビューミラービューは同じレンダリング指示に従ってしまいます。

金属溶液はありますか?

+0

メタルはこれでまったく助けになれません。 'NSView's [displayRectIgnoringOpacity:inContext:](https://developer.apple.com/reference/appkit/nsview/1483436-displayrectignoringopacity)メソッドを見ましたか? –

+0

@SilvanMosbergerそれはまさに私が必要としていたものです!あなたがその質問に答えるなら、私はあなたにそれを信用するでしょう。 –

答えて

1

おそらくNSViewdisplayRectIgnoringOpacity:inContext:メソッドを探しています。それはビューを2回描くので、最も効率的な方法ではないかもしれませんが、あなたのケースではうまくいくようです。一方、ピクセルバッファをキャッシュするほうが速いかどうかはわかりません。なぜなら、とにかく確実に多くのメモリを必要とするからです。

関連する問題