私のクラスは画像を画面外にレンダリングしています。すべての画像に対して同じコンテキストを何度も作成するのではなく、再利用するの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の問題はどうなりましたか?コンテキストを再利用しない場合、10ミリ秒ではなく20ミリ秒かかります。もちろん、画像への描画には、単に設定するよりも時間がかかります。コンテキストの再利用にも60msではなく20msかかります。しかし、なぜ?接続できるかどうかはわかりませんが、NSImageView
画像を描くのではなく設定するだけで、再利用に時間がかかる古い状態を再現できます。