在我的iPad绘图应用程序中,我创建了一个768 x 1024的缓冲区上下文,用于加快绘图速度。
这是我在调用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的外面矩形。)知道发生了什么吗?
以下是我初始化[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 :(得分:0)
我怀疑你想使用相同的rect
值来创建子图像和绘图。
如果您阅读the docs,CGImageCreateWithImageInRect
将获取图像和rect参数的交集,而CGContextDrawImage
会将图像绘制为rect。
我不知道您打算如何将其用作优化,但您的结果听起来就像我对您的代码所期望的那样。
答案 1 :(得分:0)
这个问题答案的简短版本是我想使用CGContextClipToRect而不是尝试获取子图像。 CGContextClipToRect(CGContextRef,CGRect)用于自动将任何绘图剪辑到提供的矩形之外的上下文。