- 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ı
59 lines
2.3 KiB
Markdown
59 lines
2.3 KiB
Markdown
# 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").
|
||
|
||
## Açı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.
|