2.7 KiB
2.7 KiB
Spike T-0.4 — Animasi ASCII 30 FPS + Toast (harmonica)
Status: ✅ LOLOS · Tanggal: 2026-10-15 · Mesin: Linux (PipeWire aktif), terminal pty 120×40
Tujuan (PRD Phase 0)
Prototipe animasi ASCII 30 FPS + toast slide-in, dan buktikan CPU idle < 3% (F-026).
Cara menjalankan ulang
# Laju tick headless (target 30 fps):
TIA_ANIM_SPIKE=1 go test ./internal/ui/animation/ -run TestTickerRate -v -count=1
# CPU + bandwidth render di pty (fase anim ON vs reduced-motion OFF):
python3 scripts/measure-cpu.py ./tia-love 8
Interaktif: make run → [t] toast (slide-in/out + auto-dismiss 2.5 dtk + klik = tutup),
[a] toggle reduced-motion, logo shimmer berjalan terus.
Hasil
| Metrik | Target | Hasil |
|---|---|---|
| Laju tick | 30 fps | 29.1 fps (59 tick / 2.024 dtk — jitter timer wajar) |
| CPU fase animasi ON (shimmer tiap frame + toast) | < 3% (F-026) | 2.75% ✅ |
| CPU fase reduced-motion (ticker berhenti) | — | 0.50% |
| Output terminal fase ON | — | 9.1 KB/s ≈ 310 B/frame (120×40) → diff renderer terbukti |
Keputusan implementasi
- Ticker:
tea.Tick(30 FPS) di-rearm tiapTickMsg, dengan ID sesi — saat loop di-restart (reduced-motion on/off) tick basi otomatis diabaikan; tick yang masih terjadwal tidak boleh menghidupkan ulang loop (bug ditemukan & ditambal saat spike). - Spring:
github.com/charmbracelet/harmonicav0.2.0 — catatan koreksi PRD:charm.land/harmonica/v2tidak ada;charm.land/harmonicaada tapi men-declare module pathgithub.com/charmbracelet/harmonica, jadi import resmi = jalur github. - Toast (
internal/ui/components/toast.go): tinggi tetap 4 baris (layout tidak melompat), slide via spring (damping 0.7), horizontal center, auto-dismisshold2.5 dtk. - Logo shimmer (
internal/ui/animation/logo.go): kilau berjalan dengan interpolasi warna RGB per karakter (dimoverlay1→ brightpink), jarak sirkular — murah, tanpa aset.
Temuan
- CPU 2.75% masih di bawah target 3% tapi tipis — di hardware lambat bisa melewati. Mitigasi yang sudah ada & menyusul: reduced-motion (terbukti 0.5%), dan nanti ticker di-skip saat konten tidak berubah/tidak terlihat (Phase 1).
- Diff renderer (Cursed Renderer) efisien: hanya ~310 B/frame keluar walau layar 120×40.
- Jitter tick (29.1 vs 30) berasal dari penjadwalan timer + 1 frame ekstra saat quit; untuk animasi UI tidak terasa.
Batasan (jujur)
- Angka CPU spesifik mesin ini; belum diuji di hardware low-end / terminal lambat (SSH).
- Belum uji truecolor → 256/16 warna fallback (masuk kerja theme Phase 1).
- Toast versi spike belum mendukung antrean (toast queue), hover-pause, dan klik-untuk-navigasi (F-025 penuh) — itu Phase 1.