perf: sag tik efektlerinde ilk kullanim donmasi fix — shader warmup (gizli katman ile acilista derleme), .deb guncellendi

This commit is contained in:
Alhan
2026-08-06 02:32:19 +03:00
parent 8a617558d0
commit 185653f34e
4 changed files with 184 additions and 0 deletions

View File

@@ -42,6 +42,10 @@ class _ImageCanvasState extends State<ImageCanvas> {
final ValueNotifier<int> _renderTick = ValueNotifier(0);
bool _frameScheduled = false;
// ── Shader warmup (ilk kullanım derlemesini açılışa çek) ──
bool _warmupDone = false;
int _warmupStep = 0; // 1=filtre, 2=filtre+rotate, 3=bitti
void _markRenderDirty() {
if (_frameScheduled) return;
_frameScheduled = true;
@@ -116,6 +120,30 @@ class _ImageCanvasState extends State<ImageCanvas> {
void initState() {
super.initState();
HardwareKeyboard.instance.addHandler(_onHardwareKey);
_startWarmup();
}
/// İlk kullanım shader derlemesini açılışa çek: gizli katmanda sırayla
/// filtre ve rotate render edilir, sonra değerler sıfırlanır.
void _startWarmup() {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
_warmupStep = 1;
_markRenderDirty();
WidgetsBinding.instance.addPostFrameCallback((_) => _warmupNext());
});
}
void _warmupNext() {
if (!mounted) return;
if (_warmupStep >= 2) {
_warmupDone = true;
_markRenderDirty();
return;
}
_warmupStep++;
_markRenderDirty();
WidgetsBinding.instance.addPostFrameCallback((_) => _warmupNext());
}
@override
@@ -432,11 +460,39 @@ class _ImageCanvasState extends State<ImageCanvas> {
),
),
),
_buildWarmupLayer(),
],
),
);
}
/// Görünmez 1x1 katman — ColorFiltered ve Transform shader'larınıılışta
/// derletir; kullanıcı ilk sağ tıkta derleme beklemesin.
Widget _buildWarmupLayer() {
if (_warmupDone) return const SizedBox.shrink();
final filter = ColorFilter.matrix(const <double>[
1.5, 0, 0, 0, 0,
0, 1.5, 0, 0, 0,
0, 0, 1.5, 0, 0,
0, 0, 0, 1, 0,
]);
Widget child = const SizedBox.expand();
if (_warmupStep >= 2) {
child = Transform(
alignment: Alignment.center,
transform: Matrix4.identity()..rotateZ(0.3),
child: child,
);
}
child = ColorFiltered(colorFilter: filter, child: child);
return Opacity(
opacity: 0,
child: IgnorePointer(
child: SizedBox(width: 1, height: 1, child: child),
),
);
}
Widget _errorWidget() {
return const Center(
child: Column(