2011-05-16 7 views
0

저는 iOS에서 일하고 있으며이 문제가 있습니다. 비교적 큰 데이터 집합 (500x500 이상의 C 스타일 배열)을 받게 될 것입니다. 본질적으로이 데이터에서 X/Y 플롯을 구성해야합니다. 여기서 500x500 격자의 각 데이터 포인트는 해당 값을 기반으로하는 색상과 일치합니다. 문제는 이것이 시간이 지남에 따라 변경되어 일부 애니메이션이 생성되므로 새로운 데이터 집합이 들어올 때 변경해야하는 계산이 빠르다는 것입니다.Quartz2D 성능 - 개선 방법

기본적으로 배열의 모든 점에 대해, 어떤 색으로 매핑해야하는지 파악한 다음 그리드에서 그린 사각형을 그려 데이터를 나타냅니다. 내 그리드가 768x768 픽셀이지만 500x500 데이터 세트가있는 경우 각 데이터 포인트는 약 1.5x1.5 사각형을 나타냅니다 (반올림되었지만 아이디어를 얻길 바랍니다).

새로운보기 클래스를 만들고 drawRect를 재정 의하여이를 시도했습니다. 그러나 20x20 데이터 세트 이상의 무서운 성능을 경험했습니다.

나는 이미지 버퍼에 글쓰기에 대한 몇 가지 제안을 보았으나, 그 일을하는 예제를 찾을 수 없었다. (나는 아이폰 OS에 대해 매우 익숙하다.) 어떤 제안이 있으십니까? 아니면 도움이 될만한 자원을 가르쳐 줄 수 있습니까?

다음은 생성과 오프 스크린 컨텍스트에서있는 UIImage를 반환하는 방법에 넣을 수있는 코드의

대릴

답변

1

, 시간 내 주셔서 감사합니다. 성능을 향상 시키려면 "픽셀"을 더 크게 만들거나 변경되는 부분 만 그리는 것과 같은 반복 횟수를 최소화하는 방법을 찾아보십시오.

UIGraphicsBeginImageContext(size); // Use your own image size here  

CGContextRef context = UIGraphicsGetCurrentContext();  

// push context to make it current 
// (need to do this manually because we are not drawing in a UIView) 
// 
UIGraphicsPushContext(context);        

for (CGFloat x = 0.0; x<size.width; x+=1.0) { 
    for (CGFloat y=0.0; y< size.height; y+=1.0) { 
// Set your color here 
     CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0)); 
     CGContextFillRect(context, CGRectMake(x, y, 1.0, 1.0)); 
    } 
} 


// pop context 
// 
UIGraphicsPopContext();  


// get a UIImage from the image context- enjoy!!! 
// 
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); 
[outputImage retain]; 

// clean up drawing environment 
// 
UIGraphicsEndImageContext(); 
return [outputImage autorelease]; 
+0

그건 기본적으로 그가 한 일입니다. – Eiko

+0

아니요, 그는 UIView 하위 클래스에서 drawRect를 사용했는데, 이는 오프 스크린 이미지 컨텍스트에서 그리는 것보다 훨씬 느립니다. –

+0

무엇이 훨씬 빨라지나요? 왜 스크린 밖의 상황에 그리는 것이 훨씬 저렴합니까? 나는 또한 오프 스크린 렌더링을 제안하지만, 쿼츠에 대한 25,000 건의 호출 대신에 메모리에 직접 액세스하는 것은 측정 된 것이 아니라고 생각한다. – Eiko

0

속도를 높이려면 모든 픽셀에 대해 명시적인 그리기 기능을 호출하면 안됩니다. 메모리를 할당하고 CGBitmapContextCreate을 사용하여 해당 메모리의 데이터로 이미지를 만들 수 있습니다. 기본적으로 바이트 배열입니다. 계산을 수행하고 색 정보 (a-r-g-b)를 해당 버퍼에 직접 씁니다. 그러나 서브 픽셀 정확도 (블렌딩)에 관해서는 직접 계산해야합니다.

저는 예제를 가지고 있지 않지만 CGBitmapContextCreate을 검색하면 올바른 방향을 찾을 수 있습니다.