2

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);
}
4

2 に答える 2

0

rectサブイメージの作成と描画に同じ値を使用したいとは思わない。

ドキュメントを読むCGImageCreateWithImageInRectと、画像とrectパラメータの交点を取り、CGContextDrawImage画像をrectに描画します。

これを最適化としてどのように使用する予定かはわかりませんが、結果はコードに期待するもののように聞こえます。

于 2012-08-22T15:13:38.040 に答える
0

この質問に対する答えの短いバージョンは、サブ画像を取得する代わりにCGContextClipToRectを使用したかったというものでした。CGContextClipToRect(CGContextRef、CGRect)は、指定された長方形の外側のコンテキストに描画を自動的にクリップするために使用されます。

于 2012-08-29T15:29:02.357 に答える