使用Core Graphics / Cocoa,您可以从后台线程绘制到位图上下文吗?

时间:2009-03-31 20:31:19

标签: iphone cocoa multithreading core-graphics buffering

我正在屏幕外使用CGContext创建CGBitmapContextCreate,然后使用CGImageCGBitmapContextCreateImage生成drawRect并将其绘制到我{{1}的视图中(我还在绘制其他一些东西 - 这是一种隔离不同级别的可变性和复杂性的练习)。

当它在主线程上运行时,一切正常。然而,以这种方式分割出来的动机之一是,可以在后台线程上运行屏幕外部分(我认为它应该没问题,因为它不会渲染到屏幕上下文)。

但是,当我这样做时,生成的图像是空的!我检查了代码,并放置了明智的NSLog来验证一切都按照正确的顺序进行。

我的下一步是将这个问题归结为最简单的代码来重现问题(或者找到一些我错过的愚蠢的东西并修复它) - 此时我会有一些代码在必要时发布在这里。但我首先要在这里检查一下,我不会走错路。我在googlesphere周围的旅行中找不到任何可以解决问题的事情 - 但是朋友确实提到他在尝试在后台线程中调整图像大小时遇到​​了类似的问题 - 这表明这里可能有一些普遍的限制。 / p>

[编辑]

感谢目前为止的回复。如果没有别的,他们告诉我,至少我并不是唯一一个没有答案的人 - 这是我想要找到的一部分。在这一点上,我将把额外的工作放在获得最简单的可能示例上,并且可能会返回一些代码或更多信息。在此期间,请保留任何想法: - )

提出一点:有几个人使用了关于API的术语线程安全。应该注意的是,在这种情况下有两种类型的线程安全性:

  1. API本身的可线性 - 即它可以在多个线程中使用它(全局状态和其他重入问题,例如C的strtok是API可能也不是线程安全的常见原因)。
  2. 单个操作的原子性 - 多个线程可以通过API与相同的对象和资源进行交互而无需应用程序级锁定吗?
  3. 我怀疑到目前为止提到的是第一种类型,但如果您能澄清,我将不胜感激。

    [edit2 - solve!]

    好的,我把它全部搞定了。执行摘要是问题出在我身上,而不是位图上下文本身。

    在我的后台线程中,就在我进入位图上下文之前,我正在对其他一些对象做一些准备。事实证明,间接地调用那些导致在某些视图上调用setNeedsDisplay的其他对象! 通过将完成该部分的部分分离到主线程,它现在都可以完美地工作。

    因此,对于那些遇到这个问题的人,想知道他们是否可以在后台线程上绘制位图上下文,答案就是你可以(在这里和答案中提出的警告)。

    全部谢谢

5 个答案:

答案 0 :(得分:3)

只是一个猜测,但是如果你试图从另一个线程调用setNeedsDisplay,你需要通过performSelectorOnMainThread来调用它。

答案 1 :(得分:2)

如果您在一个且只有一个线程中使用CGContextRef,那么您正在做的事情应该有用。我之前已经完成了这项工作,其中8个核心处理图像的8个不同部分,然后将不同的结果CGImageRefs合成在一起并在屏幕上绘制。

答案 2 :(得分:1)

Apple没有透露iPhone的线程安全性,但Cocoa(与UIKit相反)是generally thread safe for drawing。由于他们共享很多绘图代码,我认为在iPhone上绘图是线程安全的。

那就是说,你的经历意味着存在问题。可能是你在渲染之前使用你的图像吗?

答案 3 :(得分:0)

并非所有API都是线程安全的。有些需要锁定或要求它们在主线程上运行。您可能想要搜索文档。我相信有一个页面总结了SDK的哪些部分是线程安全的,哪些不是。

答案 4 :(得分:0)

如果有人正在/正在寻找如何做到这一点,我写了blog post来描述如何做到这一点,并将整个事情包装在NSOperation子类中。