0

画像編集用のグループ フィルター (GPUImageSepiaFilter、GPUImageExposureFilter、GPUImageSepiaFilter) を実装しました。また、カスタムの「露出」(setExposure:) 値を設定するために使用するスライダーが 1 つあります。スライダーの「didValueChanged」アクション メソッドでは、「picture processImage」を呼び出して画像プレビューを更新しています。スライダーを非常に速く動かしたり、スライダーを繰り返しスクロールしたりすると、メモリの問題によりアプリが確実にクラッシュします。

- (void)viewDidLoad  {
    [super viewDidLoad];

    self.originalPicture = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"IMG_0009.JPG"]];

    self.filterGroup = [[GPUImageFilterGroup alloc] init];

    GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
    [self.filterGroup addFilter:sepiaFilter];

    GPUImageExposureFilter *pixellateFilter = [[GPUImageExposureFilter alloc] init];
    [pixellateFilter setExposure:0.0f];
    [self.filterGroup addFilter:pixellateFilter];

    GPUImageSaturationFilter *saturation = [[GPUImageSaturationFilter alloc] init];
    [self.filterGroup addFilter:saturation];

    [sepiaFilter addTarget:pixellateFilter];
    [pixellateFilter addTarget:saturation];

    [self.filterGroup setInitialFilters:[NSArray arrayWithObjects:sepiaFilter, pixellateFilter,nil]];
    [self.filterGroup setTerminalFilter:saturation];

    [self.originalPicture addTarget:self.filterGroup];


    GPUImageView *filterView = [[GPUImageView alloc] init];
    self.view = filterView;

    [self.filterGroup addTarget:filterView];

    [self.originalPicture processImage];

    [self.slider setMinimumTrackTintColor:[UIColor redColor]];
    [self.slider setMaximumTrackTintColor:[UIColor greenColor]];
    [self.view addSubview:self.slider]; 
}

- (IBAction)didChangeValue:(id)sender {
    GPUImageExposureFilter *filter = (GPUImageExposureFilter *)[self.filterGroup filterAtIndex:1];

    [filter setExposure:self.slider.value];
    [self.originalPicture processImage];    
}

これを修正する最良の方法はどれですか? それとも私は何か間違ったことをしていますか?

ありがとう、
スリニバス

4

1 に答える 1

2

私は、画像と GPUImage に関するいくつかのアドバイスです。

  • 「ディスク」サイズの画像は、実際の画像サイズを表していません。これは、圧縮されている可能性があるためです。メモリ内で解凍され、システムがそれを処理する必要がある場合の実際の画像サイズは次のとおりです。height*width*n°channel*n°bit_for_each_channel
  • 画像は常に遅延ロードする必要があります。使用していない場合は役に立ちません。
  • Brad は、フレームバッファの再利用に関するフレームワークに大きな変更を加えました。これにより、メモリの処理方法が大幅に改善されました。github の最新バージョンを使用していますか?
  • 割り当てツールを使用してアプリのプロファイリングを試みましたか?おそらく問題は別の場所にあります.このツールを使用すると、メモリが期待どおりに増加するかどうかを確認できます.
  • imageNamedメソッドは画像をキャッシュし、たとえ彼らがこのメモリがメモリ不足の状況で追い出されると言ったとしても、私はそのパージが機能するのを見る機会がありませんでした

GPUImage を使用するコードに問題はありませんが、(ピクセル サイズで) 小さい画像を使用し、まず割り当てを使用するようにします。

于 2014-05-15T13:12:11.767 に答える