CALayerでUIImageを使用するとパフォーマンスが低下しますか?
-
03-07-2019 - |
質問
多数のCALayersを使用して、GoogleMapsと同じようにタイルベースの画像を作成しています(詳細/詳細が異なる同じ画像の異なるバージョン)。
これを行うために使用しているコードは次のとおりです。
UIImage* image = [self loadImage:obj.fileName zoomLevel:obj.zoomLevel];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
obj.layerToAddTo.contents = [image CGImage];
[CATransaction commit];
私は怠け者であるため、CoreGraphicsを使用してファイルからCGImageをロードする気はあまりありません。しかし、パフォーマンスが大幅に向上する場合は、私がします! LoadImageは、上記の画像を読み込むための正しいパスを取得するために文字列をマングルします。objは、このスレッドに必要なすべての情報を保持するNSObject構造体です。
ヘルプ?
解決
大きなパフォーマンスの向上はありません-どちらかと言えば逆です。 UIImageを使用して画像をロードすることにより、キャッシュの利点をすべて享受でき、さまざまなCALayersで使用するのが非常に高速になります。
他のヒント
これを試してみましたが、UIImageを使用するのではなく、純粋なCoreGraphicsを使用して画像をロードすると、一度に多くの画像をロードする際の速度が著しく向上しました。
"これを試してみましたが、UIImageを使用するのではなく、純粋なCoreGraphicsを使用して画像をロードすると、一度に多くの画像をロードする際の速度が大幅に向上しました。
UIImageの使用をどのように回避しましたか?もっと正確に言うと、UIImageを経由せずにCoreGraphicsに画像ファイルを直接読み込むにはどうすればよいですか?
UIImage -imageNamed:
を使用して画像をロードしない理由の1つは、画像が内部キャッシュに保存されており、メモリが少ない状況ではキャッシュがクリアされないことです。
明確な答えはありませんが、UIImageを使用する場合、CGImageを使用する場合よりも読み込み時間が遅くなると思います。 CGImageでは、作成時にイメージタイプ(jpgまたはpng)を指定しますが、UIImageでは、オブジェクトタイプを動的に決定する必要があります。確かに、これはおそらく画像ファイルの最初の数バイトを見るのと同じくらい簡単ですが、そうではないかもしれません。
画像が実際に使用されると、内部的にUIImageを表すCGImageを使用することと、自分で作成したCGImageを使用することとの間に違いがあるとは思いません。それらはまったく同じだと思います。