Files
tia-love/docs/spikes/T-0.4-animasi.md
T

2.7 KiB
Raw Blame History

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 tiap TickMsg, 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/harmonica v0.2.0 — catatan koreksi PRD: charm.land/harmonica/v2 tidak ada; charm.land/harmonica ada tapi men-declare module path github.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-dismiss hold 2.5 dtk.
  • Logo shimmer (internal/ui/animation/logo.go): kilau berjalan dengan interpolasi warna RGB per karakter (dim overlay1 → bright pink), jarak sirkular — murah, tanpa aset.

Temuan

  1. 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).
  2. Diff renderer (Cursed Renderer) efisien: hanya ~310 B/frame keluar walau layar 120×40.
  3. 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.