[Android] 画像読み込み(Glide/Coil)最適化:OOM・チラつき・遅延の全部対策

スポンサーリンク

導入:画像読み込み最適化は「入れて終わり」じゃない

Androidアプリで画像を扱うなら、Glide や Coil を使うのは当たり前ですよね。

ただし、「ライブラリを入れた=最適化完了」だと思っていると、確実に痛い目を見ます。

  • スクロール時に画像がチラつく
  • 大量表示で OOM(OutOfMemoryError)が出る
  • 表示が遅く、UXが悪化する

これらはすべて 画像読み込み設計の問題 です。

この記事では、Android上級者向けに、
Glide / Coil を使った画像読み込み最適化を「OOM・チラつき・遅延」すべてまとめて対策します。

先に結論です。

  • OOMは「Bitmapサイズ」と「キャッシュ設計」で防げる
  • チラつきは View 再利用と Placeholder でほぼ消える
  • 遅延はプリフェッチと優先度設計が9割

Glide と Coil の思想の違いを理解する

最適化の前に、まず両者の思想を整理します。

Glide

  • BitmapPool による強力なメモリ再利用
  • Transformation・キャッシュ戦略が豊富
  • 長年の実績と安定性

Coil

  • Kotlin / Coroutines 前提の設計
  • シンプルで拡張しやすい
  • Compose との相性が良い

どちらが優れている、ではなく
「どう最適化するか」が重要です。

最適化① OOM対策(最重要)

OOMの原因はほぼ次のどれかです。

  • 必要以上に大きな Bitmap を生成している
  • Bitmap が解放されていない
  • キャッシュがメモリを圧迫している

Glide:サイズ指定を必ず行う


Glide.with(context)
    .load(url)
    .override(imageView.width, imageView.height)
    .into(imageView)

サイズ指定なしでの読み込みは、
OOM一直線です。

Coil:Viewサイズに合わせる


imageView.load(url) {
    size(ViewSizeResolver(imageView))
}

Glide のメモリ使用量を下げる


Glide.get(context).setMemoryCategory(MemoryCategory.LOW)

大量画像画面では、これだけで安定性が変わります。

最適化② キャッシュ戦略

キャッシュは「速くする」だけでなく、
OOMを防ぐ役割も持っています。

Glide の DiskCacheStrategy


.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)

Coil のキャッシュ設定


imageView.load(url) {
    memoryCachePolicy(CachePolicy.ENABLED)
    diskCachePolicy(CachePolicy.ENABLED)
}

リスト表示で毎回ネットワークに行っているなら、
キャッシュ設定が間違っています。

最適化③ チラつき対策

RecyclerView でのチラつきは UX を一気に壊します。

Placeholder は必須


.placeholder(R.drawable.placeholder)
.error(R.drawable.error)

View再利用時のクリア


override fun onViewRecycled(holder: ViewHolder) {
    Glide.with(holder.itemView).clear(holder.imageView)
}

これを入れないと、
前の画像が一瞬表示される現象が出ます。

最適化④ 遅延対策(プリフェッチ)

Glide のプリフェッチ


Glide.with(context)
    .load(nextImageUrl)
    .preload()

Coil のプリフェッチ


imageLoader.enqueue(
    ImageRequest.Builder(context)
        .data(nextImageUrl)
        .build()
)

スクロールが速い画面では、
プリフェッチなし=遅延確定です。

アニメーション画像(GIF)の注意点

GIFはメモリ消費が激しく、OOMの原因になります。

可能であれば WebP へ移行しましょう。

詳しくは以下の記事で解説しています。


GIFアニメーションをループさせない方法

パフォーマンス計測を必ず行う

最適化は「体感」ではなく、
Profilerで確認してください。

  • Memory Profiler
  • Frame drops
  • GC頻度

よくある失敗

  • サイズ指定なしで画像読み込み
  • View再利用を考慮していない
  • キャッシュを無効化している

まとめ

  • 画像最適化は設計の問題
  • OOM・チラつき・遅延はすべて対策できる
  • Profilerで可視化するのが最短ルート

迷ったら:画像サイズを疑う。
それだけで9割の問題は解決します。

コメント

タイトルとURLをコピーしました