iPhoneでピクセルを速くプッシュする方法は?
-
10-07-2019 - |
質問
ピクセルプッシュについて前に質問しましたが、今では画面にノイズが表示されるのに十分な距離を移動できました。初期化の方法は次のとおりです。
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で更新できるフルスクリーンピクセルベースのグラフィックスを実行することさえ可能ですか?
解決
遅延はほぼ確実にノイズ生成にあります。 Instrumentsでこれを実行すると、おそらくループに座っているのに膨大な時間が費やされることがわかるでしょう。
別の小さな問題は、色空間です。画面の色空間を使用すると、潜在的に高価な色空間の変換を回避できます。
描画にCoreGraphicsルーチンを使用できる場合は、毎回新しいオブジェクトを作成するのではなく、描画コンテキスト用のCGLayerを作成する方が便利です。
bytesPerRowコンポーネントもパフォーマンスにとって重要です。 32 IIRCの係数である必要があります。計算方法を示すリンクテキストが利用可能なコードがいくつかあります。
そして、そう、生のパフォーマンスのために、OpenGL。
他のヒント
614400( 320 * 480 * 4
)のメモリ書き込み、乱数生成、フレームごとの新しいオブジェクトの作成により、速度が低下していると思われます。
静的なビットマップを画面に書き込んで、それがどれほど速いかを試してみましたか?コードのプロファイリングを試みたことがありますか?また、毎回新しいCGRectを作成する必要がありますか?
ランダム性の効果を与えたいだけであれば、ビットマップ全体を毎回再生成する必要はおそらくないでしょう。
私の知る限り、OpenGLはiPhoneでグラフィックスを処理する最速の方法であると考えられています。これには2Dおよび3Dが含まれます。 UIViewはコアアニメーションレイヤーに支えられており、最終的にはOpenGLで描画されます。仲介者をスキップしないのはなぜですか。
CGImageRef
を-[CALayer setContents:]
に割り当てることで、 CGContextDrawImage
を介してトリップを回避できます。ビットマップを解放しないようにしてください。まだ使用中です。
[[view layer] setContents:(id)ir];
はい、これは古いことを知っています。Googleから偶然見つけました