2011-10-09 3 views
6

매우 복잡한 그리기 논리 (GIS 데이터에서 가져온지도보기)로보기가 있습니다. 기본 스레드에서이 드로잉을 수행하면 UI가 잠기고 앱이 응답하지 않게됩니다. 예를 들어 NSOperation이있는 백그라운드 스레드로 드로잉을 옮기고 싶습니다.iOS의 배경 스레드에서 그리기

구조를 구성하는 가장 좋은 방법은 무엇입니까?

현재 메모리 부족 CGContext를 그리는 중입니다. 그 다음 CGImageRef로 변환하여 주 스레드에서 blit 뷰로 보냅니다. 불행히도 이것은 많은 메모리를 소비합니다. GPU 가속은 더 느리게 진행되므로 더 이상 사용되지 않습니다. 배경 스레드에서보기로 직접 그리는 방법이 있습니까? UIKit 다중 스레드 안전하지 않습니다하지만 어쩌면 드로잉을하는 동안보기를 잠그는 몇 가지 방법이 있습니다 알아요?

답변

1

나는 iPhone에서 이러한 상황을 경험 한 적이 없지만 Mac에서는 비슷한 문제가있었습니다.

  1. CGLayer을 사용하면 오프라인 컨텍스트의 그리기 작업을 위임 할 수 있습니다.
  2. 현재 NSRunLoop에 타이머를 추가하고 시간 간격으로 그래픽 명령을 실행 해보십시오. 그것은

...

kRenderFPS 25.0 //This is Maximum value 

renderTimer = [[NSTimer timerWithTimeInterval:(1.0/(NSTimeInterval)kRenderFPS) target:viewobject selector:@selector(RenderUI:) userInfo:nil repeats:YES] retain]; 


[[NSRunLoop currentRunLoop] addTimer:renderTimer forMode:NSDefaultRunLoopMode]; 


[[NSRunLoop currentRunLoop] addTimer:renderTimer forMode:NSModalPanelRunLoopMode]; 


[[NSRunLoop currentRunLoop] addTimer:renderTimer forMode:NSEventTrackingRunLoopMode]; 

//In view class 
-(void)RenderUI:(id)param 
{ 
    [self setNeedsDisplayInRect:[self bounds]]; 
} 

이 트릭을 할해야 ... 이런 식으로 뭔가를 보일 것입니다.

또한 프로세스를 샘플링하고 누가 CPU를 사용하고 있는지 확인하십시오. 그러면 UI가 매우 빠르게 반응합니다.

언급 한 성능 문제는 다른 이유로 인한 것일 수 있습니다. cpu 샘플 프로세스를 시도하십시오. 실제로 누가 CPU를 사용하고 있는지 파악할 수 있습니다.

+0

CALayer를 의미합니까? –

+1

번호 CGLayer. http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGLayer/Reference/reference.html – MacGeek

+0

그래서 지금이 방법을 시도하고 있지만 NSTimer로 실행하고 50 % 드로잉주기 당 최대 0.1 초 동안 0.2 초 간격으로 실행되는 시간), 모든 UI 이벤트를 여전히 무시하고있는 것처럼 보입니다. 이 트릭이 있습니까? –

6

iOS 4.0 이상, drawing is thread safe. CGContext을 직접 만들어야 할 수도 있지만 배경 스레드에서 그릴 수있는 이유는 없습니다.

즉, 대부분의 UIKit 작업은 그렇지 않습니다. 필요한 경우 언제든지 백그라운드 스레드에서 준비한 다음 필요할 때 performOnMainThread을 사용할 수 있습니다. 심지어 waitUntilDone이 있습니다. 즉, NSOperationNSOperationQueue을 사용해야합니다.

+1

이 점에 대해서는 많은 혼란이있는 것처럼 보입니다.하지만 이것은 정답입니다. UIKit을 사용한 iOS 4.0 그리기는 스레드로부터 안전합니다. 다음은 공식 발표입니다 : http://developer.apple.com/library/ios/#releasenotes/General/WhatsNewIniPhoneOS/Articles/iPhoneOS4.html ("thread"로 검색). –

+0

@Jon Tirsen, 답을 실증하는 데 도움을 주셔서 감사합니다. –

관련 문제