我有一个游戏需要一些高级绘图结构,比如复杂的贝塞尔曲线和填充(随每一帧变化),我想用 OpenGL 或 Metal 绘制的一些更原始的东西进行复合/叠加。是否有一种有效(高性能)的方法来做到这一点?
我可以在 OpenGL 图层上简单地使用石英绘图层,还是会遭受巨大的性能损失?
我应该将我的 Quartz 绘图捕获到位图并将其作为纹理推入 OpenGL 吗?或者在每一帧上这样做会非常慢?
我可以走另一条路并将我的 OpenGL 渲染捕获到我用 Quartz 绘制的位图中吗?
我能够在一个 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 循环就会获胜。您可以轻松地为叠加层创建单独的循环或背景线程以将它们分开。
NSRunLoop.currentRunLoop()
1 回答
我能够在一个 opengl 视图的顶部覆盖一个石英视图,而不会(看似)太大的性能损失。我实际上无法弄清楚如何在 Interface Builder 中做到这一点,但在代码中通过简单地创建一个“主”视图控制器并在程序上将两个视图添加为 sub-views 就像这样容易:
请注意,glk 视图有自己的刷新循环,上面假设您在 viewDidLoad()中为石英视图控制器设置了 CADisplayLink 或其他运行循环。没有必要在两者之间调用/刷新。 glk 视图似乎在默认的
NSRunLoop.currentRunLoop()
上刷新,所以如果你使用它们将争夺时间,并且看起来如果事情变得紧张,opengl 循环就会获胜。您可以轻松地为叠加层创建单独的循环或背景线程以将它们分开。