- 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ı
2.3 KiB
2.3 KiB
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 = 2048sabiti eklendi._buildImage()artık ilk yüklemedeResizeImage.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 = trueyapılıyor ve doğrudanFileImage(tam çözünürlük) kullanılıyor._handleScroll()içinde_scgü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çindeold.filePath != widget.filePathkontrolü:_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+ImageStreamListenerile 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:uivedart:typed_dataimport'ları gereksiz kalınca silindi.- Kullanılmayan
_uiImage,_fullResImage,_fullResLoadingalanları 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").
Açık Konular / Sonraki Adımlar
_downsampleTargetve swap threshold (1.5x) değerleri tune edilebilir.- LOD (progressive loading) seviyeleri — şimdilik tek kademe (2048 → full) yeterli.
- Android/iOS hedeflerinde
ResizeImagedavranışı ayrıca test edilmeli.