CoreImageで画像の加工をする その3「GPUにするべきかCPUにするべきか」

CoreImageで画像の加工をする その1「準備から実行」

CoreImageで画像の加工をする その2「フィルタの重ねがけ」

 

その1、その2からの続きというか補足です。

今までCIContextをこんな感じで作っていました。

NSDictionary *contextOptions = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [NSNumber numberWithBool:NO],kCIContextUseSoftwareRenderer,nil];
CIContext *ciContext = [CIContext contextWithOptions:contextOptions];

 

CoreImageで処理を行う場合、その処理をGPUにさせるかCPUにさせるか選べます。

上記例だとGPUで処理を行うようになっていて、非常に高速に動作します。

ただしGPUで処理を行う場合は必ずアプリがアクティブな状態である必要があります。

またCIContextが扱える画像のサイズにも上限があり、シミュレータやiPhone4Sでは4096*4096までが扱えるサイズで、それ以上のサイズの場合はCPUで処理させなければいけません。

※CIContextが扱えるサイズについては環境で違いが出るのでinputImageMaximumSizeやoutputImageMaximumSizeで確認して適切に処理するようにします

 

という訳でバックグラウンドで処理させる場合や、画像サイズが非常に大きかった場合等はCPUで処理させる必要が出てくるのですが、その場合は下記の様にCIContextを作ります

NSDictionary *contextOptions = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [NSNumber numberWithBool:YES],kCIContextUseSoftwareRenderer,nil];
CIContext *ciContext = [CIContext contextWithOptions:contextOptions];

これでCPUで処理をさせられます。

CIContextを作る際は用途や画像サイズによってGPU/CPUを選択して適切に処理をさせる事でパフォーマンスを高めることができます。

ちなみにシミュレータではCPUを選択することができません。この処理については実機で確認する必要があるので注意して下さい