Ios 我可以从多个线程绘制到同一个CGContextRef吗?
我正在制作一个应用程序,我想画很多形状——圆、盒子、线等等。 数以百万计 为了测试它的性能,我创建了这个简单的UIView。请注意,功劳是应得的-我受到了启发 这个很好用。在我的iOS模拟器上,一分钟多一点就能画出一百万个圆圈 我想加快速度,所以我尝试从多个线程绘制到位图上下文Ios 我可以从多个线程绘制到同一个CGContextRef吗?,ios,objective-c,cocoa,swift,core-graphics,Ios,Objective C,Cocoa,Swift,Core Graphics,我正在制作一个应用程序,我想画很多形状——圆、盒子、线等等。 数以百万计 为了测试它的性能,我创建了这个简单的UIView。请注意,功劳是应得的-我受到了启发 这个很好用。在我的iOS模拟器上,一分钟多一点就能画出一百万个圆圈 我想加快速度,所以我尝试从多个线程绘制到位图上下文 let group = dispatch_group_create() for i in 1...100 { dispatch_async(dispatch_get_global_queue(QOS_CLASS_
let group = dispatch_group_create()
for i in 1...100 {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
dispatch_group_enter(group)
CGContextFillEllipseInRect(context, bounds)
dispatch_group_leave(group)
}
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
然而,这并不奏效。调用CGContextFillEllipseInRect(context,bounds)
时,我获得了一个EXC\u BAD\u访问权限
在后台线程中绘制到CGContext
,只要它是创建它的同一线程就可以了
有人知道如何使其工作吗?1)您实际上并不是在等待创建的组完成--dispatch\u group\u wait
将在执行任何块之前在该代码中调用,因此其中的enter/leave调用不会产生任何效果。改用dispatch\u group\u async
(见下文)
2) 不能同时从两个不同的线程绘制到CGContext
——如果在绘图循环中添加println,可以看到这一点。它会工作几次,结果也会有所不同,但最终会出现错误
let group = dispatch_group_create()
for i in 1...10 {
dispatch_group_async(group, dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
for j in 1...100 {
println("i:\(i), j:\(j)")
CGContextFillEllipseInRect(context, bounds)
}
}
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
样本输出:
iiii::::4123,,,, jjjj::::1111
ii:1, j:2
:5, j:1
i:6, j:1
EXC_BAD_ACCESS
唯一的解决办法是跳回一个线程进行绘图,但这会以任何方式挫败您试图做的事情。如果您必须进行大量计算以决定要绘制的内容,这可能会发生在不同的线程上,但是绘制到CGContext
本身并不是线程安全的。如果不重用上下文
引用,会发生什么情况,但是获取当前位图上下文?获取位图上下文的唯一方法是在创建新图像上下文后调用UIGraphicsGetCurrentContext。否则,UIGraphicsGetCurrentContext将获得另一个上下文。我想使用多个磁芯的最好方法是画“桶”,也就是说,将完整图像的各个部分分开,然后将它们缝合在一起。
iiii::::4123,,,, jjjj::::1111
ii:1, j:2
:5, j:1
i:6, j:1
EXC_BAD_ACCESS