我有一个游戏需要一些高级绘图结构,比如复杂的贝塞尔曲线和填充(随每一帧而变化),我想用 OpenGL 或 Metal 中绘制的一些更原始的东西来合成/覆盖。有没有一种有效(高性能)的方法来做到这一点?
- 我可以简单地在 OpenGL 层上添加一个石英绘图层,还是会受到巨大的性能影响?
- 我应该将我的 Quartz 绘图捕获到位图并将其作为纹理推送到 OpenGL 中吗?还是在每一帧上都这样做会非常慢?
- 我可以换一种方式,将我的 OpenGL 渲染捕获到我用 Quartz 绘制的位图中吗?
我能够在 opengl 视图之上叠加一个石英视图,而不会(似乎)对性能造成太大影响。我实际上无法在 Interface Builder 中弄清楚如何做到这一点,但通过简单地创建一个“主”视图控制器并在程序上将两个视图添加为子视图,在代码中很容易,如下所示:
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 循环会获胜。您可以轻松地为叠加创建单独的循环或背景线程以将它们分开。