2016-07-29 3 views
0

내 Mac OSX 응용 프로그램에는 Core Graphics를 사용하여 2D 라인과 영역을 CGLayer으로 그려주는 백그라운드 프로세스가 있습니다. 그런 다음 NSView 서브 클래스의 displayRect() 메소드를 통해 주기적으로 사용자에게 표시됩니다.OSX에서 CGLayer에 대한 읽기/쓰기 액세스를 직렬화해야합니까?

현재 GCD 큐를 사용하여 레이어를 읽고 쓰는 작업을 직렬화합니다. 이렇게하면 기본 스레드가 CGContextDrawLayerAtPoint()을 사용하여 뷰에 드로잉하는 동시에 백그라운드 프로세스를 드로잉 할 수 없습니다. 그러나 이것은 약간의 성능을 필요로합니다.

질문 1 :이 R/W의 직렬화 응용 프로그램의 안정성을 위해 필요한 CGLayer에 대한 액세스인가? (나는 이상한 그릇된 이미지는 신경 쓰지 않지만 크래시의 위험을 감수하고 싶지 않다).

질문 2 : 나는 여러 동시 프로세스로 도면 작업을 분할한다면, 모두 같은 시간에 레이어에 쓰거나 내가 그들을에는 직렬화해야하도록 허용하는 것이 안전 할 것이다 (할 것이다 무의미의 동시성 종류)?

답변

0

OK 그래서 나는 질문에 대한 답변 (2) 두 개의 서로 다른 프로세스가 동일한 CGLayer 동시에 쓸 수 안전 하지입니다 NO 말할 수있는 몇 가지 테스트를 수행하는 데.

동일한 레이어에서 동시에 두 번의 동작을 시도한 경우 응용 프로그램이 비정상적으로 종료되었습니다 (EXC_BAD_ACCESS() code=1). 질문에 대한 답은 (1) 그 합니까입니다 그러나

는 백그라운드 프로세스가 여전히를 작성하는 동안 CGLayer의 동시 읽기를 할 괜찮을 것 같다. 예를 들어 백그라운드 프로세스가 파란색 모든 빨간색 사각형을 덮어 쓰는 동안 레이어를 읽은 결과가 여기에 있습니다. enter image description here