アプリの状況によっては、GPUImageFilterPipeline クラスも検討する必要がある場合があります。
Brad が参照しているすべての介在ターゲットの追加と削除を処理します。
これらのフィルターのセットアップ/ティアダウンを繰り返すことが問題であるが、クラスの存続期間中はメモリ内に保持することは問題ではない場合は、パイプラインを高く評価する場合があります。
あなたが提供したものに大まかに基づいて、次のようになります。
- (void)configureSomeArraysOfFilters {
_setNumberOne = [[NSMutableArray alloc] init]; //make sure these arrays are at least scoped to the class, if not actual @properties
GPUImageKuwaharaFilter* kuwahara = [[GPUImageKuwaharaFilter alloc] init];
[kuwahara setRadius:5];
GPUImageGrayscaleFilter* gray = [[GPUImageGrayscaleFilter alloc] init];
[_setNumberOne addObject:kuwahara];
[_setNumberOne addObject:gray];
_setNumberTwo = [[NSMutableArray alloc] init];
GPUImageGrayscaleFilter* otherGray = [[GPUImageGrayscaleFilter alloc] init];
GPUImageGaussianBlurFilter* blur = [[GPUImageGaussianBlurFilter alloc] init];
[blur setBlurSize:3];
GPUImageColorInvertFilter* invert = [[GPUImageColorInvertFilter alloc] init];
[_setNumberTwo addObject:otherGray];
[_setNumberTwo addObject:blur];
[_setNumberTwo addObject:invert];
}
- (void)configureAnEmptyPipeline {
if (_samplePipeline == nil) {
GPUImageFilter* passthrough = [[GPUImageFilter alloc] init];
NSArray* empty = [NSArray arrayWithObjects:passthrough, nil];
_samplePipeline = [[GPUImageFilterPipeline alloc] initWithOrderedFilters:empty input:videoCamera output:_filteredVideoView];
[videoCamera startCameraCapture];
}
}
- (void)updateFilterPipeline:(NSInteger)style {
switch (style) {
case 1:
[_samplePipeline replaceAllFilters:_setNumberOne];
break;
case 2:
[_samplePipeline replaceAllFilters:_setNumberTwo];
//add as many more cases as you have defined Arrays full of filters for
default:
break;
}
}
ただし、パイプラインの私のお気に入りの使用例は、実行時に一連のフィルターを動的に作成し、それらをアクションに切り替える場合です。これにより、フィルターを順番に保存してパイプラインに渡すだけで済み、各フィルター間のすべてのターゲティングを毎回指定する必要がなくなります。
すべての状況に適しているわけではありませんが、状況によっては GPUImageFilterPipeline が非常に役立つ場合があります。