2011-12-10 10 views
3

私は最終的に私たちのグラフィックスライブラリのいくつかをCoreImageを使用して画像をレンダリングするために座っています(2つの画像をブレンドするようなもの)と私はそれを持っていますが、遅い(iOS5.01 iPhone 4S)。私はinputImageとはbackgroundImageの中にブレンドした画像を得るが、それは実際に私がちょうど持っていた場合よりも時間がかかり、CoreImage、iOS5とスピード、なぜCoreImageが遅いのですか?

 CIImage *intputBackgroundImage = [[CIImage alloc] initWithCGImage:backgroundImageRef]; 
    CIImage *inputImage = [[CIImage alloc] initWithCGImage:inputImageRef]; 

    CIFilter *multiply = [CIFilter filterWithName:@"CIMultiplyBlendMode"]; 
    [multiply setDefaults]; 

    [multiply setValue:intputBackgroundImage forKey:@"inputBackgroundImage"]; 
    [multiply setValue:inputImage forKey:@"inputImage"]; 

    CIImage *result = multiply.outputImage; 
    CIContext *ctx = [CIContext contextWithOptions:nil]; 

    CGImageRef resultRef = [ctx createCGImage:result fromRect:CGRectMake(0, 0, imgFrame.size.width, imgFrame.size.height)]; 
    UIImage *resultImage = [UIImage imageWithCGImage:resultRef]; 
    CGImageRelease(resultRef); 

をそれは動作します:私は私がやっているものですここでは、CoreImageの約束は、ハードウェアアクセラレーションだと思いましたCoreGraphicsとCGContext()を使ってそれを行いました。この作業がGPUで行われていないかどうかを確認する方法はありますか?そうでない理由はありますか?

おかげで、あなたが再レンダリングを必要とする

+1

このコードをInstrumentsでプロファイリングしたときに、あなたは何を見つけましたか? –

+1

@PeterHoseyを試してみます。私はGPU/VRAMに出入りしているので、もう少し周りを読んだ後、私はそれを疑い始めている。つまり、データがGPU/VRAMにコピーされ、作業が完了し、RAM(UIImage)にコピーされた後、VRAM(UIImageを表示)にコピーされます。 – Shizam

+2

@Shizam - GPUへのアップロードはかなり速く、GPUからの情報を取り戻すための 'glReadPixels()'呼び出しも、iPhone 4上の適切なサイズの画像に対して10ミリ秒程度で実行できます。これは確かに可能ですGPU上ではCPUよりもはるかに高速に実行されるため、そこに隠れたオーバーヘッドが存在する必要があります。おそらく、Core Image内のどこかで(おそらくCGImageRefとの間で)、CPU上でフォーマット変換が行われています。 Peterが示唆しているように、Time Profilerはボトルネックがどこにあるのか疑問に思うかもしれません。 –

答えて

1

物事はCIのために最善であるか、あるいは複数のフィルタを行うために必要なもの。

CPUのメモリからGPUのメモリにアイテムをコピーする必要があるため、現在のところ速度が遅いです(iOSでのOpengl統合メモリのサポートなし)。

これは、1つのエフェクトだけを実行しているため、ダブルコピーのためにさらに時間がかかることを意味します。

+0

これは私の問題の要点だと思うので、私は 'CAEAGLLayers'の使い方を理解する必要があります。 – Shizam

関連する問題