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

时间:2016-07-29 16:02:53

标签: macos cocoa rendering quartz-graphics metal

我正在尝试显示另一个NSView的实时视觉

我的问题不是将视图呈现给图像。 cocoa: how to render view to image?

让我们调用源视图,事件视图以及一对多目标视图镜像视图

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

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

导入图层将使其充当镜像视图

想法是事件视图将投射 ncdntReflection ,并且其所有镜像视图将捕获其 mrrSurface上的反射

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

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

1。 CGLayer作为后备商店:

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

    1. 事件视图及其子视图的后备镜像绘制到 ncdntReflection
    2. 镜像视图的 mrrSurface 设置为 ncdntReflection
    3. 第3。 cacheDisplayInRect或CGWindowListCreateImage

      1. 使用任一方法
      2. 捕获事件视图的内容
      3. 将这些内容绘制到 ncdntReflection
      4. 镜像视图的 mrrSurface 设置为 ncdntReflection
      5. 由于以下原因,我不喜欢这些方法中的任何一种。

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

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

        理想情况下,事件视图镜像视图都将遵循相同的渲染说明 - 就像WPF Visual Brush一样。

        有金属溶液吗?

1 个答案:

答案 0 :(得分:1)

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