2013-03-30 3 views
1

화면에 렌더링되는 많은 개체 배열 (일반적으로 500 - 2000)이 있습니다. 불행하게도, 렌더링은 지금 당장은 그리 적절하지 않습니다. 내가 경계를 확인 같은 사소한 최적화를 남겨 두었다
(:동시 drawRect :

각 객체 즉, 현재 나의 drawRect: 방법은 다음과 같이 본질적으로 보이는, 대부분의 시간을 차지 마지막 화면에 자신을 그리는 몇 가지 계산을 수행 할 필요가 오른쪽 가독성)

- (void)drawRect:(NSRect)dirtyRect 
{ 
    for (Thing *thing in [self getThings]) 
    { 
     [thing prepareForDrawing]; 
     [thing draw]; 
    } 
} 

동시 처리를위한 확실한 후보를 위해 dirtyRect 대의 구형?

전처리 작업을 병렬 처리로 수행하고 모든 처리가 완료 될 때까지 미리 명령을 대기시킨 다음 모두를 한 번에 렌더링하는 좋은 방법을 찾지 못했습니다.

그러나 내가 생각한 선한 것을 생각하면 GCD 다음과 같은 구성표가 생겼습니다.
나에게 잘 들리지만 GCD에 익숙하지 않고 공개 된지 4 주 만에 이상한 멀티 스레딩 문제에 부딪 치거나 일반적으로 잘못된 GCD 디자인 패턴을 사용하기 전에 나는 피드백을 요청할 것이라고 생각했습니다.

잠재적 인 문제 또는 더 나은 해결책 -이 접근법에 대한 문제점을 누구나 볼 수 있습니까? 이 완료된 후 [thing draw]의 호출이 외부 -drawRect:의 일 때문에 작동하지 않습니다

- (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]; 
     }); 
    } 
} 
+0

... 시도해 보셨습니까? 그것은 작동 했는가 또는 아닙니다? – Xymostech

답변

3

. 그래픽 컨텍스트는 더 이상 해당 뷰를 그리기 위해 유효하지 않습니다.

왜 "물건"이 미리 준비되지 않았습니까? -drawRect:은 계산이 아닌 도면 용입니다. 필요한 모든 값 비싼 계산이 사전에 이루어져야합니다.

+0

아, 쓰레기. 참된. "* 메인 대기열은 메인 스레드의 CFRunLoop (Core Foundation의 경우) 또는 NSRunLoop (Cocoa의 경우)과 연관되어 있습니다. 이들은 각각 작업주기가 끝날 때 메인 대기열을 배수합니다.".. 좋은 생각이야. – Jay

+1

모든 ** 계산은 드로잉 **과 직접 관련이 있습니다. 즉, 내부 표현을 코코아 드로잉 시스템 호출로 변환합니다. 앞에서 계산을 수행하는 문제에서 언급했듯이, 기본적으로 전처리 중 어딘가에서 모든 매개 변수를 드로잉 명령 (위치, 색, 기타 컨텍스트 스터프)에 버퍼링하는 것이므로 오버 헤드가 많고 오류가 발생하기 쉽습니다. – Jay

+0

수락을 보내 주셔서 감사합니다. 그건 그렇고 동시 호출에 이어 동시 열거에서'-prepareForDrawing' 호출을 해봤습니까? –