ObjecTips

Swift & Objective-C で iOS とか macOS とか

UIGraphicsBeginImageContextWithOptions をやめて UIGraphicsImageRenderer を使うメリット

WWDCのメモリのセッションを見ていたら思わぬTipsについて言及されていた。

WWDC 2018 iOS Memory Deep Dive の20分57秒あたり https://developer.apple.com/videos/play/wwdc2018/416

UIGraphicsBeginImageContextWithOptions を使うのはやめて UIGraphicsImageRenderer を使えという話題。

UIGraphicsImageRenderer は最適なグラフィックフォーマットを自動で選択してくれる。
マスク画像の様な単色の画像を描画する場合に UIGraphicsBeginImageContextWithOptions では1ピクセル4バイトのsRGBに対して UIGraphicsImageRenderer は1ピクセル1バイトで75%のメモリの節約になる。*1

さらに UIGraphicsImageRenderer で作成された単色の UIImageUIImageViewtintColor などで表示色の変更が可能で、複数の色の画像が欲しい場合にそれぞれの色でレンダリングして異なる UIImage を作成しなくても tintColor を各ビューに設定するだけで済むとの事。

*1:UIGraphicsImageRenderer はワイドカラーにも対応しているので、単色の場合はメモリの節約になるけどワイドカラーが適用されるケースでは1ピクセル8バイトで逆にメモリ使用量は倍に増える。