私は最終的に私たちのグラフィックスライブラリのいくつかを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で行われていないかどうかを確認する方法はありますか?そうでない理由はありますか?
おかげで、あなたが再レンダリングを必要とする
このコードをInstrumentsでプロファイリングしたときに、あなたは何を見つけましたか? –
@PeterHoseyを試してみます。私はGPU/VRAMに出入りしているので、もう少し周りを読んだ後、私はそれを疑い始めている。つまり、データがGPU/VRAMにコピーされ、作業が完了し、RAM(UIImage)にコピーされた後、VRAM(UIImageを表示)にコピーされます。 – Shizam
@Shizam - GPUへのアップロードはかなり速く、GPUからの情報を取り戻すための 'glReadPixels()'呼び出しも、iPhone 4上の適切なサイズの画像に対して10ミリ秒程度で実行できます。これは確かに可能ですGPU上ではCPUよりもはるかに高速に実行されるため、そこに隠れたオーバーヘッドが存在する必要があります。おそらく、Core Image内のどこかで(おそらくCGImageRefとの間で)、CPU上でフォーマット変換が行われています。 Peterが示唆しているように、Time Profilerはボトルネックがどこにあるのか疑問に思うかもしれません。 –