我有一个大数组的对象(通常是500-2000)呈现到屏幕上。不幸的是,渲染在目前并不完全是快速的。
每个对象都需要执行一些计算,这些计算占用了大部分时间,并最终绘制到屏幕上,也就是说,目前我的drawRect:方法基本上如下所示:
(为了提高可读性,我忽略了一些琐碎的优化,比如检查边框与dirtyRect )。
- (void)drawRect:(NSRect)dirtyRect
{
for (Thing *thing in [self getThings])
{
[thing prepareForDrawing];
[thing draw];
}
}显然是并发处理的候选对象,对吗?
我无法想出一种好的方法来将准备工作与实际的绘图操作分离开来,即并行执行预处理,并以某种方式将绘图命令排队,直到所有处理完成,然后一次渲染所有操作。
然而,考虑到GCD的好处,我想出了以下方案。
这听起来还不错,但对GCD来说还不错,在公开发布4周后遇到奇怪的多线程问题之前,或者只是使用了一个糟糕的GCD设计模式,我想我应该征求反馈。
有人能看到这种方法的问题吗?潜在的问题,或者更好的解决方案?
- (void)drawRect:(NSRect)dirtyRect
{
[[self getThings] enumerateObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
// prepare concurrently
Thing *thing = (Thing*)obj;
[thing prepareForDrawing];
// always draw in main thread
dispatch_async(dispatch_get_main_queue(), ^{
[thing draw];
});
}
}发布于 2013-03-30 15:22:53
这不起作用,因为[thing draw]的调用在-drawRect:完成后将发生在-drawRect:之外。图形上下文对于绘制到该视图将不再有效。
为什么“事物”没有预先准备好?-drawRect:是用于绘图,而不是计算。任何必要的昂贵计算都应该事先完成。
https://stackoverflow.com/questions/15719929
复制相似问题