定期的に更新されるイメージを 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 レンダリングを使用する場合、その形式でソース画像を作成するだけかもしれませんが、形式を直接読み込めないのは面倒です :(