3

以前にピクセルプッシュについて尋ねたところ、画面にノイズを表示するのに十分な距離まで到達することができました. これが私がどのように初期化するかです:

CGDataProviderRef provider;
bitmap = malloc(320*480*4);
provider = CGDataProviderCreateWithData(NULL, bitmap, 320*480*4, NULL);
CGColorSpaceRef colorSpaceRef;
colorSpaceRef = CGColorSpaceCreateDeviceRGB();
ir = CGImageCreate(
320,
480,
8,
32,
4 * 320,
colorSpaceRef,
kCGImageAlphaNoneSkipLast,
provider,
NULL,
NO,
kCGRenderingIntentDefault
);

各フレームをレンダリングする方法は次のとおりです。

for (int i=0; i<320*480*4; i++) {
bitmap[i] = rand()%256;
}
CGRect rect = CGRectMake(0, 0, 320, 480);
CGContextDrawImage(context, rect, ir); 

問題は、これが非常に遅く、約 5fps であることです。バッファを公開するパスが間違っているに違いないと思います。3D チップを使用せずに、30fps で更新できるフルスクリーンのピクセルベースのグラフィックスを実行することは可能ですか?

4

4 に答える 4

2

遅さはほぼ確実にノイズ生成にあります。これをInstrumentsで実行すると、ループにかなりの時間が費やされていることがわかるでしょう。

もう1つの小さな問題は、色空間です。画面の色空間を使用すると、コストがかかる可能性のある色空間の変換を回避できます。

描画に CoreGraphics ルーチンを使用できる場合は、毎回新しいオブジェクトを作成するのではなく、描画コンテキスト用の CGLayer を作成する方が適切です。

bytesPerRow コンポーネントもパフォーマンスにとって重要です。これは、32 IIRC の係数である必要があります。それを計算する方法を示すいくつかの利用可能なコードリンク テキストがあります。

そして、ええ、生のパフォーマンスのために、OpenGL.

于 2008-10-12T02:39:58.613 に答える
1

私の知る限り、OpenGLはiPhoneでグラフィックスを作成するための最速の方法であると考えられています。これには、2Dと3Dが含まれます。UIViewはコアアニメーションレイヤーによって支えられており、とにかくOpenGLで描画することになります。だから、仲買人をスキップしてみませんか。

于 2008-10-11T18:04:43.957 に答える
1

614400 ( 320*480*4) のメモリ書き込み、乱数の生成、およびフレームごとに新しいオブジェクトの作成を行うと、速度が低下していると思われます。

画面に静的なビットマップを書き込んでみて、どれだけ速いか試してみましたか? おそらくコードのプロファイリングを試みましたか? また、毎回新しい CGRect を作成する必要がありますか?

ランダム性の効果を与えたいだけなら、毎回ビットマップ全体を再生成する必要はないでしょう。

于 2008-10-11T15:40:09.257 に答える
1

CGContextDrawImagetoを割り当てることでトリップを回避できますCGImageRef-[CALayer setContents:]、まだ使用している間はビットマップを解放しないでください。

[[view layer] setContents:(id)ir];

はい、私はこれが古いことを知っています.Googleから偶然見つけました.

于 2009-12-22T20:30:37.877 に答える