10

私のiPadアプリでは、画面外のビットマップにレンダリングしてから、ビットマップを画面に描画しています。(これは、既存のビットマップレンダリングコードを再利用したいためです。)iPad 2では、これは魅力のように機能しますが、Retinaディスプレイを備えた新しいiPadでは、解像度はまだですが、ビットマップの描画は非常に遅くなります。同じ。

ビットマップを描画するには、通常のQuartz 2D関数を使用します。CGImageCreateデータプロバイダーはCGDataProviderCreateWithData、32ビットRGBA形式で作成されますkCGImageAlphaNoneSkipLastUIViewビットマップを表示するで、では、で返されるコンテキストにビットマップを描画するためにdrawRect:使用します。CGContextDrawImageUIGraphicsGetCurrentContext

私は2倍の解像度で描画しようとさえしていないことに注意してください。今のところ、iPad 2で使用していたのと同じ解像度で問題ありません。CoreGraphicsが内部でピクセルを2倍にして、それをGPUに送信しているようです。 、CGImageGPUに直接渡すには、私が作成しているもので問題ないはずですが。何か案は?

4

1 に答える 1

15

CoreGraphicsが内部でピクセルを2倍にし、それをGPUに送信しているようです。

かなり。より正確に(少なくとも精神的に):

  1. UIKitは、CGBitmapContextビューの境界のサイズをデバイスピクセル単位で作成します
  2. そのコンテキストを現在のコンテキストにします
  3. CGImageあなたはその文脈にあなたを引き込みます
  4. ...したがって、CGはソース画像を再スケーリングし、すべての宛先ピクセルにタッチする必要があります
  5. 描画が完了したら、UIKitはCGImageビットマップコンテキストからを作成します
  6. そしてそれをビューのレイヤーのコンテンツに割り当てます。

私が作成しているCGImageは、GPUに直接渡すのに適しているはずです。

それを実現したい場合は、上記の手順のいくつかを切り取って、システムにそれを実行するように指示する必要があります。

(UIKit、CoreAnimation、およびCoreGraphicsの間に、期待どおりの「高速パス」を提供するリンクはありません。)

最も簡単な方法は、を作成し、それをラッピングUIImageViewに設定することです。imageUIImageCGImageRef

または、をに設定view.layer.contentsしますCGImageRef。(そして、オーバーライドしたり、呼び出したりしないようにしてください。また、そうでないことを確認ください使用する方が簡単です。)-drawRect:-setNeedsDisplaycontentMode UIViewContentModeRedrawUIImageView

于 2012-05-03T03:20:22.987 に答える