iPadの描画アプリには、描画を高速化するために作成して使用する768x1024のバッファーコンテキストがあります。
drawRectが呼び出されたときに現在実行しているコードは、既存の図面を画面にコピーするだけです。
CGContextRef context = UIGraphicsGetCurrentContext();
CGImageRef image = CGBitmapContextCreateImage([DrawingState sharedState].context);
CGContextDrawImage(context, CGRectMake(0, 0, 768, 1024), image);
CGImageRelease(image);
このコードは期待どおりに機能します。バックグラウンドコンテキストから画像を収集して現在のコンテキストに描画し、画像を解放します。できます!
ただし、描画を高速化するためにパフォーマンスチューニングを行っており、代わりにこのコードを試しています。ここで、「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の外側にあるため、画像の一部が描画されないため、わかりません。長方形。)何が起こっているのか分かりますか?
以下は、[DrawingStatesharedState].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);
}