【问题标题】:How should I synchronize the rendered content of two NSViews?我应该如何同步两个 NSView 的渲染内容?
【发布时间】:2016-07-29 16:02:52
【问题描述】:

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

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


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

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

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

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

这个想法是 Incident View 将投射一个 ncdntReflection 并且其所有 Mirror Views 将在其 mrrSurface 上捕捉该反射.

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

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

1. CGLayer 作为后备存储:

  1. Incident View及其子视图的内容绘制到ncdntReflection中。
  2. ncdntReflection 绘制到 Incident View 的 当前上下文中。
  3. Mirror View(s)mrrSurface 设置为 ncdntReflection

2。将 CALayers 合成到 CGLayer 中

  1. Incident View 的支持 CALayers 及其子视图绘制到 ncdntReflection 中。
  2. Mirror View(s)mrrSurface 设置为 ncdntReflection

3. cacheDisplayInRect 或 CGWindowListCreateImage

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

出于以下原因,我不喜欢这些方法中的任何一种。

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

选项 3 需要太长时间才能成为有效的解决方案。

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

有金属溶液吗?

【问题讨论】:

  • Metal 根本帮不了你。你看过NSViews displayRectIgnoringOpacity:inContext: 方法吗?
  • @SilvanMosberger 这正是我所需要的!如果你回答了这个问题,我一定会感谢你。

标签: macos cocoa rendering quartz-graphics metal


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多