화면에 렌더링되는 많은 개체 배열 (일반적으로 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];
});
}
}
... 시도해 보셨습니까? 그것은 작동 했는가 또는 아닙니다? – Xymostech