Files
imajviewer/docs/rapor-downsampling-swap.md
Alhan 45cf56a1e6
Some checks failed
Build & Release / build-linux (push) Has been cancelled
Build & Release / build-windows (push) Has been cancelled
Build & Release / create-release (push) Has been cancelled
feat: downsampling + full-res swap + RAM leak fix
- Büyük resimler ilk yüklemede max 2048px'e downsampling (RAM ~1.6MB)
- Zoom 1.5x stretch'i geçince full-res'e swap (orijinal çözünürlük)
- Resim geçişinde eski provider evict + ImageCache.evict() (RAM leak)
- Tiled render kodu tamamen kaldırıldı
2026-08-14 21:22:26 +03:00

2.3 KiB
Raw Permalink Blame History

Durum Raporu: Downsampling + Full-Res Swap + RAM Leak Fix

Tarih: 2026-08-14 Branch: main

Yapılan Değişiklikler

Tek dosya: lib/widgets/image_canvas.dart

1. Downsampling (ilk yüklemede RAM tasarrufu)

  • _downsampleTarget = 2048 sabiti eklendi.
  • _buildImage() artık ilk yüklemede ResizeImage.resizeIfNeeded(2048, null, ...) kullanıyor. Büyük resimler (ör. 12000px) 2048px'e küçültülerek decode ediliyor.
  • Önceki davranış: resim her zaman tam çözünürlükte decode ediliyordu (cacheWidth = longest * _sc * 2), bu da dev resimlerde RAM'i dolduruyordu.

2. Full-Res Swap (zoom'da kalite)

  • _checkFullResSwap(): downsampled resmin viewport'a oranı (stretch) 1.5x'i geçince _usingFullRes = true yapılıyor ve doğrudan FileImage (tam çözünürlük) kullanılıyor.
  • _handleScroll() içinde _sc güncellendikten sonra çağrılıyor.
  • Sonuç: küçük görünümde 2048px (RAM ~1.6MB), zoom ile yakınlaşınca orijinal.

3. RAM Leak Fix (resim geçişlerinde sızıntı)

  • didUpdateWidget() içinde old.filePath != widget.filePath kontrolü:
    • _cachedFileImage?.evict(), _cachedProvider?.evict()
    • PaintingBinding.instance.imageCache.evict(FileImage(File(old.filePath)))
    • Tüm cache alanları null'a çekiliyor.
  • Önceki davranış: her yüklenen resim Flutter'ın global ImageCache'inde birikiyor, RAM sürekli artıyordu.

4. Görüntü boyutu takibi

  • _imageSize, loadingBuilder + ImageStreamListener ile decode edilen gerçek piksel boyutundan dolduruluyor. _checkFullResSwap() bu değeri stretch hesabında kullanıyor.

Temizlik

  • Tiled render kodunun tamamı kaldırıldı (Flutter codec API region decode desteklemiyor).
  • dart:ui ve dart:typed_data import'ları gereksiz kalınca silindi.
  • Kullanılmayan _uiImage, _fullResImage, _fullResLoading alanları kaldırıldı.

Doğrulama

  • flutter analyze --no-pub: 0 error.
  • flutter build linux --debug: başarılı.
  • Kullanıcı testi: onaylandı ("herşey tamam gözüküyor").

ık Konular / Sonraki Adımlar

  • _downsampleTarget ve swap threshold (1.5x) değerleri tune edilebilir.
  • LOD (progressive loading) seviyeleri — şimdilik tek kademe (2048 → full) yeterli.
  • Android/iOS hedeflerinde ResizeImage davranışı ayrıca test edilmeli.