2017-06-10 37 views
0

私は、GPUIImagePictureの対象となるさまざまなGPUIImageFiltersの値を操作するためのスライダーを設定しました。現在のチェーンオーダーは次のようになります。GPUImage - フィルタチェーンの順序は重要ですか?

self.gpuImagePicture = [[GPUImagePicture alloc] initWithImage:self.image]; 
[self.gpuImagePicture addTarget:self.toneCurveFilter]; 
[self.toneCurveFilter addTarget:self.exposureFilter]; 
[self.exposureFilter addTarget:self.constrastFilter]; 
[self.constrastFilter addTarget:self.saturationFilter]; 
[self.saturationFilter addTarget:self.highlightShadowFilter]; 
[self.highlightShadowFilter addTarget:self.whiteBalanceFilter]; 
[self.whiteBalanceFilter addTarget:self.gpuImageView]; 
[self.whiteBalanceFilter setInputRotation:[self gpuImageRotationModeForImage:self.image] atIndex:0]; 
[self.gpuImagePicture processImage]; 

トーンカーブフィルターを取り外すと、すべてがスムーズに機能します。私がトーンカーブフィルターだけを使用しても、私は問題はありません。上記の実装を使用すると処理が大幅に遅くなります。

メモリの管理と処理に関するトーンカーブフィルタを追加したとき、またはチェーンの残りの部分にトーンカーブフィルタを追加したときのフィルタチェーンの順序は、この設定をエッジに押し込むだけですか?

EDIT:

私はスライダーがフィルタ値を変更する方法を言及する価値があるかもしれません実現してきました。たとえば、露出スライダを移動すると、次のコードがトリガされます。

[self.exposureFilter setExposure:sender.value]; 
[self.gpuImagePicture processImage]; 
+0

プロファイリングなしでは、何かを言うのは難しいです。あなたはGPUをプロファイルしようとしましたか? –

答えて

0

時々、フィルタの順序は問題ありませんが、通常はそうです。色調整操作の中には、出力を変更せずに並べ替えることができるように機能するものもありますが、ほとんどのフィルタ計算では並べ替えを行うと、結果が多少異なることがあります。演算の順番を変更したり、かっこを動かしたりする算術演算のように考えてください。

ここで、パフォーマンスやメモリの使用に関しては、通常は順序は関係ありません。ブランチング操作は、これが有効になる唯一のケースです(複数の出力をターゲットとするフィルタ、ある時点で1つの出力にブレンドまたは結合されるフィルタを持つ)。あなたはここにそれを持っていません。

上記の手順がいくつかあり、チェーンしているすべてのフィルタにオーバーヘッドがあります。しかし、上記のボトルネックはGPUImagePictureの作成でなければならないので、私はパフォーマンスの違いを見ることさえ驚いています。テクスチャとしてピクチャを再レンダリングしてアップロードするために必要なCore Graphicsを通過するため、それらのうちの1つをインスタンス化することは、実行するフィルタよりもはるかに遅くなります。

toneCurveFilterなどを再利用する場合は、-addTarget:を再度使用する前に、以前のすべてのターゲットから完全に切断されていることを確認してください。すべてのフィルタを以前のターゲットに接続したままでピクチャを切り替えている可能性があります。つまり、新しいピクチャごとにターゲットを追加し続けることになります。これは非常に減速につながります。

私は上記のようなものがあなたを減速させてくれると思っていますが、疑わしい時にはTime ProfilerやOpenGLプロファイラを起動して、実際にどこの時間を費やしているのかを見てください。

関連する問題