首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发drawRect:

并发drawRect:
EN

Stack Overflow用户
提问于 2013-03-30 15:01:33
回答 1查看 227关注 0票数 1

我有一个大数组的对象(通常是500-2000)呈现到屏幕上。不幸的是,渲染在目前并不完全是快速的。

每个对象都需要执行一些计算,这些计算占用了大部分时间,并最终绘制到屏幕上,也就是说,目前我的drawRect:方法基本上如下所示:

(为了提高可读性,我忽略了一些琐碎的优化,比如检查边框与dirtyRect )。

代码语言:javascript
复制
- (void)drawRect:(NSRect)dirtyRect
{
   for (Thing *thing in [self getThings])
   {
        [thing prepareForDrawing];
        [thing draw];
   }
}

显然是并发处理的候选对象,对吗?

我无法想出一种好的方法来将准备工作与实际的绘图操作分离开来,即并行执行预处理,并以某种方式将绘图命令排队,直到所有处理完成,然后一次渲染所有操作。

然而,考虑到GCD的好处,我想出了以下方案。

这听起来还不错,但对GCD来说还不错,在公开发布4周后遇到奇怪的多线程问题之前,或者只是使用了一个糟糕的GCD设计模式,我想我应该征求反馈。

有人能看到这种方法的问题吗?潜在的问题,或者更好的解决方案?

代码语言:javascript
复制
- (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];
      });
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-30 15:22:53

这不起作用,因为[thing draw]的调用在-drawRect:完成后将发生在-drawRect:之外。图形上下文对于绘制到该视图将不再有效。

为什么“事物”没有预先准备好?-drawRect:是用于绘图,而不是计算。任何必要的昂贵计算都应该事先完成。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15719929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档