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

59 lines
2.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.