Iphone 使用Core Graphics/Cocoa,可以从背景线程绘制位图上下文吗?
我在屏幕外绘制一个使用Iphone 使用Core Graphics/Cocoa,可以从背景线程绘制位图上下文吗?,iphone,cocoa,multithreading,core-graphics,buffering,Iphone,Cocoa,Multithreading,Core Graphics,Buffering,我在屏幕外绘制一个使用CGBitmapContextCreate创建的CGContext,然后用CGBitmapContextCreateImage从中生成一个CGImage,并将其绘制到drawRect(我还在上面画了一些其他的东西——这是一个隔离不同层次的可变性和复杂性的练习) 当它都在主线程上运行时,这一切都很好。然而,以这种方式将其拆分的动机之一是,屏幕外的部分可以在后台线程上运行(我认为这应该是可以的,因为它没有呈现到屏幕上的上下文) 但是,当我这样做时,生成的图像是空的!我已经检查了
CGBitmapContextCreate
创建的CGContext
,然后用CGBitmapContextCreateImage
从中生成一个CGImage
,并将其绘制到drawRect
(我还在上面画了一些其他的东西——这是一个隔离不同层次的可变性和复杂性的练习)
当它都在主线程上运行时,这一切都很好。然而,以这种方式将其拆分的动机之一是,屏幕外的部分可以在后台线程上运行(我认为这应该是可以的,因为它没有呈现到屏幕上的上下文)
但是,当我这样做时,生成的图像是空的!我已经检查了代码,并放置了明智的NSLog以验证一切都是按正确的顺序发生的
我的下一步是将其归结为再现问题的最简单代码(或者找到我缺少的一些愚蠢的东西并修复它)-在这一点上,如果必要的话,我会在这里发布一些代码。但我首先想在这里检查一下,我没有走错这条路。我在Google Sphere的旅行中找不到任何可以发光的东西-但一位朋友确实提到,他在尝试在背景区域调整图像大小时遇到了类似的问题d-这可能有一些一般性的限制
[编辑]
感谢到目前为止的回复。如果他们没有告诉我,至少我不是唯一一个没有答案的人——这是我想找到的部分。在这一点上,我将把额外的工作投入到获取最简单的示例中,并可能带回来一些代码或更多信息。同时保留任何ide即将到来的时刻:-)
需要指出的一点是:一些人在API中使用了线程安全这一术语。应注意,在这种情况下,有两种类型的线程安全:
谢谢大家并非所有API都是线程安全的。有些需要锁定,或者需要在主线程上运行。您可能需要浏览文档。我相信有一个页面总结了SDK的哪些部分是线程安全的,哪些部分不是 如果在一个且仅在一个线程中使用CGContextRef,那么您所做的应该是可行的。我以前用过8个内核处理图像的8个不同部分,然后将不同的结果CGImageRef合成在一起并在屏幕上绘制。苹果没有提到iPhone上的线程安全,但Cocoa(与UIKit相反)是。由于他们共享很多绘图代码,我认为在iPhone上绘图是线程安全的
也就是说,你的经验意味着存在问题。是否在渲染图像之前使用图像?只是猜测,但如果您试图从另一个线程调用setNeedsDisplay,则需要通过performSelectorOnMainThread调用它。如果有人正在/正在搜索如何执行此操作,我已经编写了一个描述如何执行此操作的示例,并将整个过程封装在NSOperation子类中。谢谢。但我是从主线上说的。我在另一个线程上做的唯一一件事是绘制位图上下文我将你的标记为已接受,因为它与原因最接近-即使它没有直接引导我找到它:-)不。在我的线程方法的末尾,我在主线程上设置了对另一个方法的调用,该方法反过来调用setNeedsDisplay。只有在这一点上,图像才会从位图上下文中生成,并用于绘制到视图。我在问题中没有提到这一点,但添加了iPhone标签,这在这里可能很重要,也可能不重要(罗杰·诺兰在回答中也提到了这一点),谢谢凯洛亚。我很感激你的回答,但这正是我的出发点。我希望得到更多的细节,因为我的“搜索文档”还没有得出任何明确的结论。您对问题和解决方案的详细描述帮助我找出了我自己的代码的错误。谢谢!