4

定期的に更新されるイメージを iPhone にレンダリングする際に深刻なパフォーマンスの問題に悩まされています。今日iPad 3で試してみたところ、2fpsしか得られないことがわかりました。これは遅すぎました。そのため、プロファイリングを行うことにしましたが、ほぼすべての時間が画像を 32 ビット ARGB 画像に変換するのに費やされていることがわかりました (UIImage drawInRect の後)。UIKit が OpenGLES を使用してレンダリングすると誰もが言っていることを考えると、パフォーマンスがどれほどひどいものであるかに、私は非常にショックを受けています。

そこで、レンダリング コードを GLES1 に変換しました (mo で GLES2 レンダラーをセットアップするのは面倒です ;))。パフォーマンスが跳ね上がりました。私は今20以上のfpsを得ています。実際、パフォーマンスは非常に優れており、完全な Retina レンダリングを実行できるかどうか疑問に思っています。

とにかく、次のようにテクスチャを作成しています。

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, &colours.front() );

残念ながら、これはコンポーネントの順序を逆にします。次のビット順序を逆にすることで「修正」しました。

val     = ((rgba.a >> 7) << 15) | ((rgba.b >> 3) << 10) | ((rgba.g >> 3) << 5) | ((rgba.r >> 3) << 0);

に:

val     = ((rgba.r >> 3) << 11) | ((rgba.g >> 3) << 6) | ((rgba.b >> 3) << 1) | ((rgba.a >> 7) << 0);

したがって、これにより、コンポーネントの順序が CGImage で逆になっていることが確認されます。ただし、このコードは複数の製品で使用されているため、「コンポーネントを反転した」イメージをロードする方法を考え出す必要があります。

そのため、フラグ「GL_UNSIGNED_SHORT_1_5_5_5_REV」を見つけましたが、機能させることができません。

私は次のコードを試しました:

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, &colours.front() );

と:

glTexImage2D( GL_TEXTURE_2D, 0, GL_BGRA, width, height, 0, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, &colours.front() );

しかし、どちらもGL_INVALID_ENUMを返します。それで、私は何を間違っていますか?コンポーネントの反転画像をロードすることさえ可能ですか?

前もって感謝します!

編集:暫定的に、私はまだ別のピクセルクラスを導入し、次のコードを追加しました:

inline uint32_t UpdateGLTexture( uint32_t texture, std::vector< R5G5B5A1 >& colours, unsigned int width, unsigned int height )
{
    std::vector< A1R5G5B5 > convertedColours( colours.size() );
    ColourSpaceConversion::ConvertFormat( convertedColours, colours );
    return UpdateGLTexture( texture, convertedColours, width, height );
}

これで正しいレンダリングができましたが、この種の色変換を回避しようとしています。GL レンダリングを使用する場合、その形式でソース画像を作成するだけかもしれませんが、形式を直接読み込めないのは面倒です :(

4

2 に答える 2

3

GL_UNSIGNED_SHORT_1_5_5_5_REV が機能しない理由は、iOS では非常に便利ですが、テクスチャ形式ではないためです。1555 16b フォーマットは GL_EXT_read_format_bgra 拡張 (定義されている #ifdef ブロックを参照) の一部であり、残念ながら glTexImage2D ではなく、glReadPixels に対してのみこの列挙型を定義します。

http://www.khronos.org/registry/gles/extensions/EXT/EXT_read_format_bgra.txt

これは面倒です。iOS は 16b サムネイルを A1B5G5R5 に格納し、CGBitmapContext も A1B5G5R5 レンダリングをサポートしますが、OpenGL ES は iOS で R5G5B5A1 (5551) のみをサポートします。私の知る限り、16b 5551 を使用する ALAsset サムネイルを直接ダウンロードする方法はありません。

于 2013-09-24T02:47:11.337 に答える
1

UIKit は OpenGL ES を使用してレンダリングしません。合成と変換のために OpenGL ES テクスチャに結果をキャッシュするだけです。ベクトルの描画はまだ CPU バウンドであるため、Retina ディスプレイにステップアップするときにラスタライズする必要があるピクセル数を 4 倍にすると、速度が低下します。

何をしようとしているのかよくわかりませんが、BGRA データを OpenGL ES テクスチャにアップロードしたいようです。その場合、次のようなことを行う必要があります。

glGenTextures(1, &outputTexture);
glBindTexture(GL_TEXTURE_2D, outputTexture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeToUseForTexture.width, (int)pixelSizeToUseForTexture.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData);

ここでは、ピクセルあたり 32 バイトの完全な RGBA テクスチャを作成しています。ここで試みたよりコンパクトなテクスチャではありません。これは、テクスチャに余分な色の忠実度が必要だったからです。試したことはありませんが、上記をよりコンパクトなカラー形式でも使用できると思います。

于 2012-11-03T23:12:32.473 に答える