【问题标题】:How can i use Cocoa/CoreText/Quartz for multithreaded drawing如何使用 Cocoa/CoreText/Quartz 进行多线程绘图
【发布时间】:2010-08-27 01:56:47
【问题描述】:

有什么方法吗?

后台线程绘制的最佳实践是什么。

是否可以将 [NSView drawRect] 中的矩形数据存储在队列中,让后台线程获取矩形并创建一些位图并将数据渲染到位图中,然后使用 performSelectorOnMainThread:withObject 来绘制它?或者我可以直接从背景中绘制到上下文中。

我从 Bunny Laden 那里买了《Programming with Quartz 2D》这本书,但还没有读过,书中也没有关于多线程的提示。在正常的 Apple API 参考页面中也找不到任何内容。

【问题讨论】:

    标签: multithreading cocoa


    【解决方案1】:

    是的,可以将 [NSView drawRect] 中的矩形数据存储在队列中,让后台线程获取矩形并创建一些位图并将数据渲染到位图中,然后使用 performSelectorOnMainThread:withObject 进行绘制。

    只要你以线程安全的方式进行。

    这与绘图无关,因此没有理由在“使用 Quartz 2D 编程”中提到它(顺便说一句,这是一本很棒的书 - 你一定要花时间阅读它)。您可能想要一本关于多线程的配套书籍。

    只需考虑问题的第一部分。您将如何将矩形存储在队列中?将其添加到 NSMutableArray?不是线程安全的。

    Grand Central Dispatch 将提供很大帮助(您没有提及您希望支持的平台)。

    【讨论】:

    • 我更喜欢 posix pthreads 用于所有同步的东西。但我的问题是 NSFont、NSColor、NSImage 或 Quartz 对应物是否都是线程安全的——至少当我保证我的代码一次只从一个线程调用一个对象时。如果可能会将对象从一个线程传递到另一个线程,因此它们不能使用全局变量或线程局部变量。
    • 线程安全意味着您不必保证一次只使用一个线程。如果你能保证,那么问题就解决了。一些 gui 类必须在主线程上使用——这与线程安全无关——这是因为运行循环、通知等。 NSImage 可能属于这一类。坚持使用石英和核心文本。
    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多