我的课是在屏幕外渲染图像。我认为重复使用CGContext
而不是为每张图像一次又一次地创建相同的上下文将是一件好事。我设置了一个成员变量,所以如果nil 像这样_imageContext
,我只需要创建一个新的上下文:_imageContext
if(!_imageContext)
_imageContext = [self contextOfSize:imageSize];
代替:
CGContextRef imageContext = [self contextOfSize:imageSize];
当然我不再发布CGContext
了。
这些是我所做的唯一更改,结果表明重用上下文将渲染从大约 10 毫秒减慢到 60 毫秒。我错过了什么吗?在再次绘制之前,我是否必须清除上下文或其他内容?还是为每个图像重新创建上下文的正确方法?
编辑
发现了最奇怪的联系..
当我在寻找应用程序开始渲染图像时应用程序的内存异常增加的原因时,我发现问题在于我将渲染图像设置为NSImageView
.
imageView.image = nil;
imageView.image = [[NSImage alloc] initWithCGImage:_imageRef size:size];
看起来 ARC 没有发布以前的NSImage
. 避免这种情况的第一种方法是将新图像绘制到旧图像中。
[imageView.image lockFocus];
[[[NSImage alloc] initWithCGImage:_imageRef size:size] drawInRect:NSMakeRect(0, 0, size.width, size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
[imageView.image unlockFocus];
[imageView setNeedsDisplay];
内存问题消失了,CGContext
-reuse 问题发生了什么?不重用上下文现在需要 20 毫秒而不是 10 毫秒 - 当然,绘制到图像中比仅仅设置它需要更长的时间。重用上下文也需要 20 毫秒而不是 60 毫秒。但为什么?我看不出可能有任何联系,但我可以通过设置NSImageView
' 图像而不是绘制它来重现重用需要更多时间的旧状态。