CGContextRef 作为 OpenGL 上下文

Posted

技术标签:

【中文标题】CGContextRef 作为 OpenGL 上下文【英文标题】:CGContextRef as OpenGL Context 【发布时间】:2012-10-10 15:13:34 【问题描述】:

通常,我只会使用 NSOpenGLContext,但在这种情况下,我必须拥有一个 ,以支持我正在使用的其他一些框架。我的问题是:这可以做到吗?

我不能使用 glReadPixels() 来填充上下文,因为这样做会方式变慢。我必须在整个屏幕 (1440 x 900) 上每秒至少渲染 32 次,所以性能对我来说是一个非常重要的问题。有没有办法让 OpenGL 有效地绘制到 CGContextRef 中,还是我需要某种解决方法?

【问题讨论】:

“我必须有一个 CGContextRef”——为什么? 出于多种原因。最大的原因是与我正在使用的另一个框架的兼容性。 "我现在可以做到了。" 假设你的意思是“我知道”,你怎么会这么想? Apple 似乎不太可能允许您通过随机 OpenGL 调用来颠覆 Quartz2D。 是的,我的意思是知道。我不知道这是一个错字还是只是我有另一个大脑放屁。我知道这是可能的,因为我看到了其他问题,其中很多都在这个网站上,提到使用CGContextRef 作为 OpenGL 上下文。此外,这就是CGContextRef 的用途:Apple 的绘图命令,归结为 OpenGL 绘图命令。 @Justin:你能举一个这样的问题的例子吗?我搜索了一下,没有找到;我看到的所有这些都使用了位图 CGContextRef。此外,即使 Apple 的绘图命令直接使用 OpenGL(而不是更可能使用 Apple 的 OpenGL 命令使用的),Apple 也可能不会让您直接弄乱他们的 OpenGL 上下文。如果他们这样做了,您可以更改 GL 状态,以使 Quartz2D 不再适用于该窗口。至少,不是没有他们验证他们期望设置的状态是否已设置。此外,您还可以获得他们的物品并与他们玩耍。 【参考方案1】:

因为使用 GLContext 和使用 glReadPixels() 而不是 CGContext 似乎有 1 个功能会导致问题。为什么不创建多个上下文?

阅读here关于共享上下文的信息,将上下文专用于后台线程或操作队列,并将您的繁重操作读入其中并通过共享上下文访问它以在主线程上下文中呈现它。

如果您仍然必须使用 CGContextRef,您能告诉我们您正在使用的确切框架需要它吗?这里的人也许可以提供另一种解决方案

【讨论】:

您能告诉我如何使用 CGContextRef 吗?我使用 QuartzCore、CoreGraphics、Cocoa 和我自己为一些特殊效果制作的框架。在某些情况下,它们比 OpenGL 运行得更快,因为当我放大目标对象或场景时,执行相同操作的片段着色器会变慢。如果您仍然认为我不应该使用 CGContextRef,也许我将不得不接受其他东西并使用更复杂的东西来保持性能良好。 你能告诉我们你说需要使用什么框架需要CGContextRef吗?

以上是关于CGContextRef 作为 OpenGL 上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何清除 CGContextRef?

CGContextRef使用简要教程

如何缓存 CGContextRef

drawRect中的多个CGContextRef

你需要在 Swift 中发布 CGContextRef 吗?

CGContextRef&CGMutablePathRef&UIBezierPath简单学习