如何有效地合成 Quartz 和 OpenGL / Metal 绘图?

How can I composite Quartz and OpenGL / Metal drawing efficiently?

我有一款游戏需要一些高级绘图结构,例如复杂的贝塞尔曲线和填充(随每一帧而变化),我想将它们与在 OpenGL 或 Metal 中绘制的一些更原始的东西进行合成/叠加。有没有一种有效(高性能)的方法来做到这一点?

  1. 我可以简单地在 OpenGL 层上添加一个石英绘图层吗?否则这会严重影响性能吗?
  2. 我应该将我的 Quartz 绘图捕获到位图并将其作为纹理推送到 OpenGL 中吗?或者在每一帧上都这样做会非常慢吗?
  3. 我可以换一种方式将我的 OpenGL 渲染捕获到我用 Quartz 绘制的位图中吗?

我能够在 opengl 视图之上覆盖石英视图,而不会(看起来)对性能造成太大影响。我实际上无法弄清楚如何在 Interface Builder 中执行此操作,但通过简单地创建一个 "master" 视图控制器并按程序将两个视图添加为子视图,在代码中就足够简单了,如下所示:

let glkViewController = GLKViewController()
self.view.addSubview( glkViewController!.view )

let overlayView = OverlayView()
overlayView.opaque = false
overlayView.frame = self.view.frame
let overlayViewController = OverlayViewController()
overlayViewController.view = overlayView
self.view.addSubview(overlayView)
overlayViewController.viewDidLoad()

请注意,glk 视图有其自己的刷新循环,并且以上假设您在 viewDidLoad() 中为您的石英视图控制器设置了 CADisplayLink 或其他 运行 循环。两者之间不需要调用/刷新。 glk 视图似乎在默认 NSRunLoop.currentRunLoop() 上刷新,因此如果您使用它,它们将争夺时间,而且如果事情变得紧张,opengl 循环似乎会获胜。您可以轻松地为叠加层创建单独的循环或后台线程以将它们分开。