2016-07-29 90 views
0

我试图展示一个活的视觉什么是另一个NSView的样子。我应该如何同步两个NSView的渲染内容?

我的问题不是将视图渲染为图像。 cocoa: how to render view to image?


让我们把源代码视图,事件视图和一对多目的地观点,镜像区域

每个视图都有一个导出和导入CGLayer。

导出图层将使其充当事件视图

导入图层将使其充当Mirror View

的想法是,事件视图会施放一个ncdntReflection及其所有镜像区域将赶上反思自己mrrSurface

  • ncdntReflection:事件视图的导出CGLayer。
  • mrrSurface:镜像视图的导入CGLayer。

我试过3种方法至今...

1 CGLayer作为后备存储:

  1. 事件视图绘制内容及其子视图到ncdntReflection
  2. Draw ncdntReflection into Incident View的当前上下文。
  3. 套装镜观(S)ncdntReflection mrrSurface

2.复合CALayers到CGLayer

  1. 事件视图及其子视图绘制后盾CALayers到ncdntReflection
  2. 套装镜观(S)ncdntReflection mrrSurface

3 cacheDisplayInRect或CGWindowListCreateImage

  1. 捕捉使用这两种方法
  2. 绘制这些内容进入ncdntReflection事件视图的内容。
  3. 套装镜观(S)ncdntReflection mrrSurface

由于以下原因,我不喜欢这些方法。

Collapsing Layers不是一个选项,因为我需要在每个图层上的动画。这意味着选项1和2都必须递归才能获得所有的子视图。我很担心这种绘图的性能受到影响。

选项3只是太长时间才能成为现场解决方案。

理想既事件视图镜像区域将遵循同样呈现指令 - 就像一个WPF视觉画笔。

是否有金属解决方案?

+0

金属不能完全帮助你。你看过'NSView' [displayRectIgnoringOpacity:inContext:](https://developer.apple.com/reference/appkit/nsview/1483436-displayrectignoringopacity)方法吗? –

+0

@SilvanMosberger这正是我需要的!如果你回答这个问题,我一定会相信你的。 –

回答

1

可能您正在寻找NSView s displayRectIgnoringOpacity:inContext:方法。它可能不是最有效的方法,因为它可以两次绘制视图,但它似乎适用于您的情况。另一方面,我不确定是否会更快地缓存像素缓冲区,无论如何需要更多的内存。