4

このコードが実行回数に応じて異なる速度で実行される理由を説明するAppleのドキュメントが見つかりません。

- (void)speedTest2:(CIImage*)source {
    NSTimeInterval start = CFAbsoluteTimeGetCurrent();

    CIFilter* filter = [CIFilter filterWithName:@"CIColorInvert"];
    [filter setValue:source forKey:kCIInputImageKey];

    CGImageRef cgImage = [_context createCGImage:filter.outputImage fromRect:source.extent];
    UIImage* output = [UIImage imageWithCGImage:cgImage];
    if (cgImage)
        CFRelease(cgImage);
    _source.image = output;

    NSLog(@"time: %0.3fms", 1000.0f * (CFAbsoluteTimeGetCurrent() - start));
}

実行時間

  • アプリの新規インストール-メソッドの最初の呼び出し= 206ms
  • アプリが再起動しました-メソッドの最初の呼び出し= 61ms
  • メソッドへの2番目の呼び出し(3番目、4番目、...)= 14ms

すべての実行で同じソースイメージが使用されています。

CoreImageがフィルターチェーンを連結していることは知っています。これはどういうわけかキャッシュされていますか?ユーザーが最初のアプリの起動時にパフォーマンスの問題に見舞われないように、この操作を事前にキャッシュできますか?

これは私を夢中にさせています:(

4

2 に答える 2

6

オーバーヘッドの一部は、イメージライブラリ自体のロードである可能性があります。エフェクトがピクセルシェーダーとして実装されている場合は、舞台裏でコンパイル手順が実行されている可能性があります。

この隠れたコストは避けられませんが、より都合の良い時間にそれを行うことを選択できます。たとえば、アプリケーションがロードされているとき。

小さな画像(1x1 px)をロードし、ロード中にいくつかの効果を適用して、それが役立つかどうかを確認することをお勧めします。

また、Appleの公式フォーラムで回答を試すこともできます。

于 2012-12-07T20:05:24.630 に答える
-2

outputImgaeを描画するコンテキストを作成する方法は3つあります。contextWithOptions:これは、あなたが考案したGPUまたはCPuで作成します。contextWithEAGLContext:; contextWithEAGLContext:オプション:GPUで作成。CoreImageプログラミングガイドをご覧ください。

于 2012-12-05T11:38:21.823 に答える