我应该如何同步两个 NSViews 的渲染内容?
How should I synchronize the rendered content of two NSViews?
我正在尝试展示另一个 NSView 的实时视觉效果。
我的问题不是将视图渲染成图像。 cocoa: how to render view to image?
我们将源视图称为事件视图,将一对多目标视图称为镜像视图。
每个视图都有一个导出和导入 CGLayer。
导出层将让它充当事件视图。
导入层将让它充当镜像视图。
想法是 事件视图 将投射一个 ncdntReflection 及其所有 镜像视图 会在他们的 mrrSurface.
上捕捉到反射
- ncdntReflection: 事件视图的导出 CGLayer。
- mrrSurface: 镜像视图导入CGLayer。
到目前为止我已经尝试了 3 种方法...
1. CGLayer 作为后备存储:
- 将事件视图及其子视图的内容绘制到ncdntReflection。
- 将 ncdntReflection 绘制到 事件视图的 当前上下文中。
- 将镜像视图的mrrSurface设置为ncdntReflection。
2。将 CALayers 合成到 CGLayer
- 将 Incident View 及其子视图的支持 CALayers 绘制到 ncdntReflection.
- 将镜像视图的mrrSurface设置为ncdntReflection。
3。 cacheDisplayInRect 或 CGWindowListCreateImage
- 使用任一方法捕获事件视图的内容
- 将这些内容绘制到ncdntReflection.
- 将镜像视图的mrrSurface设置为ncdntReflection。
我不喜欢这些方法,原因如下。
折叠层不是一个选项,因为我需要在每个层上都有动画。这意味着选项 1 和 2 都必须递归才能获得所有子视图。我担心这种绘图的性能下降。
选项 3 花费的时间太长,无法成为实时解决方案。
理想情况下,事件视图 和镜像视图 都遵循相同的渲染指令 - 就像 WPF 视觉画笔一样。
有金属溶液吗?
您可能正在寻找 NSView
的 displayRectIgnoringOpacity:inContext: 方法。它可能不是最有效的方法,因为它绘制了两次视图,但它似乎适用于您的情况。另一方面,我不确定缓存像素缓冲区是否会更快,无论如何肯定需要更多内存。
我正在尝试展示另一个 NSView 的实时视觉效果。
我的问题不是将视图渲染成图像。 cocoa: how to render view to image?
我们将源视图称为事件视图,将一对多目标视图称为镜像视图。
每个视图都有一个导出和导入 CGLayer。
导出层将让它充当事件视图。
导入层将让它充当镜像视图。
想法是 事件视图 将投射一个 ncdntReflection 及其所有 镜像视图 会在他们的 mrrSurface.
上捕捉到反射- ncdntReflection: 事件视图的导出 CGLayer。
- mrrSurface: 镜像视图导入CGLayer。
到目前为止我已经尝试了 3 种方法...
1. CGLayer 作为后备存储:
- 将事件视图及其子视图的内容绘制到ncdntReflection。
- 将 ncdntReflection 绘制到 事件视图的 当前上下文中。
- 将镜像视图的mrrSurface设置为ncdntReflection。
2。将 CALayers 合成到 CGLayer
- 将 Incident View 及其子视图的支持 CALayers 绘制到 ncdntReflection.
- 将镜像视图的mrrSurface设置为ncdntReflection。
3。 cacheDisplayInRect 或 CGWindowListCreateImage
- 使用任一方法捕获事件视图的内容
- 将这些内容绘制到ncdntReflection.
- 将镜像视图的mrrSurface设置为ncdntReflection。
我不喜欢这些方法,原因如下。
折叠层不是一个选项,因为我需要在每个层上都有动画。这意味着选项 1 和 2 都必须递归才能获得所有子视图。我担心这种绘图的性能下降。
选项 3 花费的时间太长,无法成为实时解决方案。
理想情况下,事件视图 和镜像视图 都遵循相同的渲染指令 - 就像 WPF 视觉画笔一样。
有金属溶液吗?
您可能正在寻找 NSView
的 displayRectIgnoringOpacity:inContext: 方法。它可能不是最有效的方法,因为它绘制了两次视图,但它似乎适用于您的情况。另一方面,我不确定缓存像素缓冲区是否会更快,无论如何肯定需要更多内存。