2016-07-29 6 views
0

Приложение для Mac OSX имеет фоновый процесс, который использует Core Graphics для рисования 2D линий и областей в CGLayer. Затем это время периодически отображается пользователю через метод displayRect() подкласса NSView.Нужно ли сериализовать доступ для чтения/записи к CGLayer в OSX?

В настоящее время я использую очередь GCD для сериализации задач, которые читаются и записываются на уровень. Это гарантирует, что фоновый процесс никогда не будет рисовать на нем, в то же время основной поток рисует его в виде с использованием CGContextDrawLayerAtPoint(). Однако, это стоило мне некоторой производительности.

Вопрос 1: Является ли сериализация R/W доступа к CGLayer необходимым для стабильности приложения? (Я не против странного неправильно отображаемого изображения, но я не хочу рисковать крахом).

Вопрос 2: Если бы я должен был разделить задачу рисования на несколько параллельных процессов, было бы безопасно разрешить им все писать на слой в одно и то же время или мне нужно будет их сериализовать (что сделало бы параллельный вид бессмысленно)?

ответ

0

ИТАК, сделав некоторые тесты я могу сказать, что ответ на вопрос (2) является NO это НЕ безопасно, чтобы два разных процесса писать одновременно на одной и той же CGLayer.

Когда я попытался сделать два одновременных действия CGContextFillRect() на том же уровне, приложение завершилось с ошибкой EXC_BAD_ACCESS() code=1.

Однако ответ на вопрос (1) является то, что ДЕЛАЕТ, кажется, хорошо делать одновременно читал о CGLayer в то время как фоновый процесс еще писать. Например, вот результат чтения слоя, в то время как фоновый процесс находится в процессе перезаписи всех красных квадратов с синими. enter image description here