2012-08-22 3 views
2

내 iPad 드로잉 앱에서 드로잉 속도를 높이고 만드는 768 x 1024 버퍼 컨텍스트가 있습니다. 내 배경 맥락에서 수집 한 이미지 :iPad 드로잉 : CGContext로 이미지 그리기

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGImageRef image = CGBitmapContextCreateImage([DrawingState sharedState].context); 
CGContextDrawImage(context, CGRectMake(0, 0, 768, 1024), image); 
CGImageRelease(image); 

이 코드는 단지 예상대로 작동 : 여기

는 내가 현재의 drawRect 단순히 사본이 이미 화면에 그리기 기존의 나하는 것을 호출 될 때 실행하고있어 코드 그것을 현재 컨텍스트에 그려서 이미지를 해제합니다. 그것은 작동합니다!

그러나, 나는 내 그림 속도를 높이기 위해 몇 가지 성능 튜닝을하고있어 내가 대신, "RECT는"의 drawRect에 의해 전달 된 사각형이고이 코드를 시도하고

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGImageRef image = CGBitmapContextCreateImage([DrawingState sharedState].context); 
CGImageRef subImage = CGImageCreateWithImageInRect(image, rect); 
CGContextDrawImage(context, rect, subImage); 
CGImageRelease(subImage); 
CGImageRelease(image); 

이 작동하지 않습니다; 이미지가 올바른 위치에 나타나지 않고 올바른 이미지가 아닐 수도 있습니다 (잘못된 위치에 이미지가 나타나면 이미지의 일부가 drawRect의 외부에 있기 때문에 그려지지 않습니다. 직사각형.) 어떤 생각이 벌어지고 있는가?

다음은 [DrawingState sharedState] .context를 초기화하는 방법입니다. 이 부분은 괜찮을 것입니다.하지만 완성을 위해 그것을 포함시킬 것이라고 생각했습니다.

if(context != NULL) 
{ 
    CGContextRelease(context); 
    context = NULL; 
} 
if(bitmapData != NULL) 
{ 
    free(bitmapData); 
    bitmapData = NULL; 
} 
if(colorSpace != NULL) 
{ 
    CGColorSpaceRelease(colorSpace); 
    colorSpace = NULL; 
} 

CGSize canvasSize = CGSizeMake(screenWidth, screenHeight); 

int bitmapByteCount; 
int bitmapBytesPerRow; 

bitmapBytesPerRow = (canvasSize.width * 4); 
bitmapByteCount  = (bitmapBytesPerRow * canvasSize.height); 

colorSpace = CGColorSpaceCreateDeviceRGB(); 

bitmapData = malloc(bitmapByteCount); 

if(bitmapData == NULL){ 
    NSLog(@"Buffer could not be alloc'd"); 
} 

//Create the context 
context = CGBitmapContextCreate(bitmapData, canvasSize.width, canvasSize.height, 8, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst); 

요청에 따라 수행하려는 실제 최적화가 아래에 나와 있습니다. 내 버퍼 컨텍스트에 버퍼 이미지 (추가 드로잉을하기 전에)를 그리고 나서 현재 버퍼 컨텍스트를 현재 컨텍스트에 복사하고 있습니다.

원본 코드 :

CGContextClearRect([DrawingState sharedState].context, CGRectMake(0, 0, 768, 1024)); 
if(bufferImage != NULL) 
{ 
    CGContextDrawImage([DrawingState sharedState].context, CGRectMake(0, 0, 768, 1024), bufferImage); 
} 

최적화 된 코드 :

CGContextClearRect([DrawingState sharedState].context, rect); 
if(bufferImage != NULL) 
{ 
    CGImageRef subImage = CGImageCreateWithImageInRect(bufferImage, rect); 
    CGContextDrawImage([DrawingState sharedState].context, rect, bufferImage); 
    CGImageRelease(subImage); 
} 

답변

0

이 질문에 대한 답변의 짧은 버전은 하위 이미지를 가져 오는 대신 CGContextClipToRect를 사용하고 싶다는 것입니다. CGContextClipToRect (CGContextRef, CGRect)는 제공된 사각형 외부의 컨텍스트에 모든 도면을 자동으로 클립하는 데 사용됩니다.

0

난 당신이 하위 이미지를 작성 및 도면에 대해 동일한 rect 값을 사용하려는 의심한다.

the docs을 읽으면 CGContextDrawImage은 이미지를 rect로 그릴 것이고 CGImageCreateWithImageInRect은 이미지와 rect 매개 변수의 교차점을 취합니다.

어떻게 이것을 최적화로 사용할지 모르겠지만 결과는 귀하의 코드에서 기대하는 것처럼 들립니다.

+0

좀 자세히 설명해 주시겠습니까? "이미지"는 화면의 전체 크기를 나타내는 이미지입니다. subImage는 화면을 새로 고쳐야하는 부분을 가리 킵니다. 그런 다음, 새로 고쳐야하는 사각형을 기준으로 subImage를 currentContext에 붙여 넣습니다. 어떤 rect가이 시나리오에서 "잘못"하다고 생각합니까? 또한, 이것은 내가하려는 정확한 최적화는 아니지만, 시도하고있는 최적화와 완전히 똑같은 문제가 있으며 다른 것들을 보여주기가 훨씬 쉽다는 것을 알았습니다. – MikeS

+0

drawRect : rect 매개 변수는 로컬 뷰 좌표 공간에서 가져 오지만 버퍼는 화면 좌표 공간에 있습니다. 따라서 잘못된 버퍼에서 "자르고"있습니다. UIView docs "View Coordinate Systems 사이의 변환"을 살펴볼 것을 제안합니다. 거기에서 당신을 도울 수있는 기능을 찾을 수 있습니다.특히 CGImageCreateWithImageInRect와 함께 사용하는 rect를 화면 (윈도우) 좌표로 변환하려고합니다. –

+0

내 현재보기가 화면 크기이므로 문제가 될 것이라고 생각하지 않습니다. 맞습니까? 전달되는 직사각형의 일부 로깅을했는데 직사각형이 통과 될 것으로 예상되는 것처럼 보입니다. – MikeS

관련 문제