2016-07-29 33 views
0

Meine Mac OSX-Anwendung verfügt über einen Hintergrundprozess, bei dem 2D-Linien und -Bereiche mithilfe von Core Graphics in eine CGLayer gezeichnet werden. Diese wird dann über die displayRect() Methode eines NSView Subklasse an den Benutzer periodisch angezeigt.Müssen Lese-/Schreibzugriffe auf einen CGLayer in OSX serialisiert werden?

Im Moment verwende ich eine GCD-Warteschlange, um die Aufgaben zu serialisieren, die auf der Ebene lesen und schreiben. Dadurch wird sichergestellt, dass der Hintergrundprozess nicht gleichzeitig mit dem Hauptprozess gezeichnet werden kann, wenn der Hauptprozess ihn mit CGContextDrawLayerAtPoint() in die Ansicht zeichnet. Das kostet mich jedoch etwas Leistung.

Frage 1: Ist die Serialisierung von R/W-Zugriffen auf die CGLayer notwendig für die Stabilität der App? (Ich habe nichts gegen das seltsam falsch dargestellte Bild, aber ich möchte keinen Absturz riskieren).

Frage 2: Wenn ich die Zeichnungsaufgabe in mehrere gleichzeitige Prozesse aufteilen würde, wäre es sicher, sie alle gleichzeitig auf die Ebene schreiben zu lassen oder müsste ich sie serialisieren (was das machen würde die Nebenläufigkeit Art von sinnlos)?

Antwort

0

OK so einige Tests gemacht zu haben ich die Antwort auf Frage sagen kann, (2) NO ist es NICHT sicher, lassen zwei verschiedene Prozesse gleichzeitig auf den gleichen CGLayer schreiben ist.

Wenn ich versuchte, zwei gleichzeitige CGContextFillRect() Aktionen auf der gleichen Schicht, die Anwendung endete abnormal mit EXC_BAD_ACCESS() code=1.

jedoch die Antwort auf die Anfrage (1) ist, dass ist DOES scheinen in Ordnung zu sein, ein gleichzeitiges Lesen eines CGLayer zu tun, während ein Hintergrundprozess noch zu schreiben ist. Hier ist zum Beispiel das Ergebnis des Lesens einer Ebene, während ein Hintergrundprozess gerade dabei ist, alle roten Quadrate mit blauen zu überschreiben. enter image description here