首页 文章

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

提问于
浏览
2

我有一个游戏需要一些高级绘图结构,比如复杂的贝塞尔曲线和填充(随每一帧变化),我想用 OpenGL 或 Metal 绘制的一些更原始的东西进行复合/叠加。是否有一种有效(高性能)的方法来做到这一点?

  • 我可以在 OpenGL 图层上简单地使用石英绘图层,还是会遭受巨大的性能损失?

  • 我应该将我的 Quartz 绘图捕获到位图并将其作为纹理推入 OpenGL 吗?或者在每一帧上这样做会非常慢?

  • 我可以走另一条路并将我的 OpenGL 渲染捕获到我用 Quartz 绘制的位图中吗?

1 回答

  • 0

    我能够在一个 opengl 视图的顶部覆盖一个石英视图,而不会(看似)太大的性能损失。我实际上无法弄清楚如何在 Interface Builder 中做到这一点,但在代码中通过简单地创建一个“主”视图控制器并在程序上将两个视图添加为 sub-views 就像这样容易:

    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 循环就会获胜。您可以轻松地为叠加层创建单独的循环或背景线程以将它们分开。

相关问题