在非主线程上允许UIKit,Core Graphics,Core Animation,OpenGL的哪些部分?

Ort*_*ntz 6 iphone multithreading opengl-es core-graphics uikit

在我的基于OpenGL-ES 1.1的应用程序中,我使用CALayers作为OpenGL纹理的源代码.这些CALayer包括CGImages和通过CoreGraphics呈现的文本.另一个OpenGL纹理源是UIView使用-[CALAyer renderInContext:]和使用的截图UIGraphicsGetImageFromCurrentImageContext.目前,我完全在主线程上运行.

特别是后一种情况非常糟糕,因为它会在创建UIView及其屏幕截图所需的整个时间内停止OpenGL渲染.

现在我正在考虑将OpenGL代码移动到一个单独的线程中,希望绕过这种阻塞.理想情况下,屏幕截图将在OpenGL渲染的不同线程(主线程,如果需要)上进行.

我无法在文档中找到关于需要在主线程上运行什么以及什么不能运行的完整报道.我在iOS 4发行说明中找到了一些评论,并在特定的UIKit方法中发现了一些评论但我错过了完整的图片.

代码在iOS 4.x或更高版本上运行.

Bra*_*son 3

您可以在后台线程上使用 OpenGL ES 进行绘图,只要您不尝试同时从另一个线程访问 OpenGL 上下文即可。有关这方面的更多信息,请参阅 Apple 的技术问答 QA1612 。

我在从后台线程更新 CALayer 内容时遇到了许多问题,因此我在主线程上对图层进行任何操作。不管怎样,核心动画在后台线程上触发它的动画。

我从未从后台线程更新过与 UIKit 相关的任何内容,但 UIKit 中绘图的某些方面在 4.0 中已实现线程安全。David Duncan在这里评论说,绘制到上下文现在是线程安全的。

在你的情况下,我不会看到在后台线程上运行 OpenGL ES 渲染的问题(也许在 GCD 中使用串行调度队列来防止同时从多个线程访问上下文),然后在另一个线程上进行图像抓取。