我应该如何同步两个 NSViews 的渲染内容?

How should I synchronize the rendered content of two NSViews?

我正在尝试展示另一个 NSView 的实时视觉效果

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


我们将源视图称为事件视图,将一对多目标视图称为镜像视图

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

导出层将让它充当事件视图

导入层将让它充当镜像视图

想法是 事件视图 将投射一个 ncdntReflection 及其所有 镜像视图 会在他们的 mrrSurface.

上捕捉到反射

到目前为止我已经尝试了 3 种方法...

1. CGLayer 作为后备存储:

  1. 事件视图及其子视图的内容绘制到ncdntReflection
  2. ncdntReflection 绘制到 事件视图的 当前上下文中。
  3. 镜像视图mrrSurface设置为ncdntReflection

2。将 CALayers 合成到 CGLayer

  1. Incident View 及其子视图的支持 CALayers 绘制到 ncdntReflection.
  2. 镜像视图mrrSurface设置为ncdntReflection

3。 cacheDisplayInRect 或 CGWindowListCreateImage

  1. 使用任一方法捕获事件视图的内容
  2. 将这些内容绘制到ncdntReflection.
  3. 镜像视图mrrSurface设置为ncdntReflection

我不喜欢这些方法,原因如下。

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

选项 3 花费的时间太长,无法成为实时解决方案。

理想情况下,事件视图镜像视图 都遵循相同的渲染指令 - 就像 WPF 视觉画笔一样。

有金属溶液吗?

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