perf: sag tik efektlerinde ilk kullanim donmasi fix — shader warmup (gizli katman ile acilista derleme), .deb guncellendi
This commit is contained in:
@@ -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ı açı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(
|
||||
|
||||
Reference in New Issue
Block a user