2010-07-09 3 views
4

내보기에 몇백 개의 선과 원을 그려야하며 뷰를 업데이트하기 위해 [myView setNeedsDisplay]라고하는 타이머 함수를 계속 움직입니다.iPhone에서 몇 줄과 원을 그릴 때 CGContextStrokePath 성능이 좋지 않습니다.

나는 UIView의에서 (MYVIEW) 서브 클래스 화해, 다음을 수행의 drawRect 함수를 구현 ...

-(void) drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGFloat red[4] = { 1, 0, 0, 1}; 

    CGContextSetLineWidth(context, 1); 
    CGContextSetShouldAntialias(context, NO); 
    CGContextSetLineCap(context, kCGLineCapSquare); 
    CGContextSetStrokeColor(context, red); 

    // rects is an array of CGRect of size ~200 
    for (int i = 0; i < N; i++) { 
     CGContextAddEllipseInRect(context, rects[i]); 
    } 
    // points is an array of CGPoint of size ~100 
    CGContextAddLines(context, points, N); 

    CGContextStrokePath(context, color); 
} 

을하지만이 개 느립니다. 내가 여기서 누락 된 것이 있습니까? 하나의 완전한 그림을 그리는 데 거의 1 초가 걸립니다.

답변

7

끊임없이 다시 그려서 개체를 움직이는 것은 좋지 않은 방법입니다. 쿼츠 그리기는 디스플레이 시스템이 작동하는 방식 때문에 UI 방식으로 할 수있는 가장 느린 작업 중 하나입니다.

대신 애니메이션을 적용 할 각 요소에 대해 개별 레이어 또는보기를 만드는 것이 좋습니다. 이러한 레이어 또는 뷰는 한 번만 그려지고 캐시됩니다. 레이어가 이동하면 다시 합성되지 않고 합성됩니다. 이렇게하면 가장 느린 iOS 장치 (원래 iPhone, iPhone 3G 및 1 세대 iPod touch)도 초당 60 프레임으로 최대 100 개의 레이어에 애니메이션을 적용 할 수 있습니다.

만화를 움직이는 것처럼 생각하십시오. 애니메이터는 모든 프레임의 모든 부분을 손으로 다시 그리게하지 않고 셀을 사용하여 프레임을 유지하거나 변형하지 않고 프레임간에 요소를 재사용합니다. 이것은 만화 제작의 노력을 현저하게 감소시킵니다.

+0

빠른 답장을 보내 주신 Brad에게 감사드립니다. 그러나 여기에서 내 문제는 각 반복에서 알고리즘이 임의의 기하학적 도형을 반환 할 수 있기 때문에 사전에 그려서 주변을 이동하는 것이 어렵다는 것입니다. 나는 그럴 수있는 방법이있을 것이라고 확신합니다. 하지만 지금은 해결 방법을 찾았습니다. 모든 내용을 원시 메모리 버퍼에 저장하고 UIImage로 변환하여 표시합니다. 그것은 훨씬 빨라 보인다. – Abix

+0

@Abix : 해결 방법이 아니라 실제 해결책이라고 생각합니다. Brad은 문제를 해결할 수있는 방법을 제안하는 것이 아니라 Quartz만으로도 자신의 업무에 잘못된 도구라고 설명합니다. –

관련 문제