Diff Rendering
MonoTerm uses intelligent change detection to only render what actually changed.DiffHint: The Rendering Decision
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DiffHint MODES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β MonoTerm determines the optimal rendering mode for each update: β
β β
β βββββββββββ βββββββββββ βββββββββββ βββββββββββ β
β β#########β β.........β β.........β β X X X X β β
β β#########β β..##.....β β.........β β X X X X β β
β β#########β β.........β β...._....β β X X X X β β
β β#########β β.........β β.........β β X X X X β β
β βββββββββββ βββββββββββ βββββββββββ βββββββββββ β
β Full Partial None Skip β
β Render ALL Render SOME Cursor only Discard β
β β
β β
β Full = Major screen changes (opening vim, running ls) β
β Partial = Small changes (typing, line updates) β
β None = Cursor only moved/blinked β
β Skip = Invalid frame detected (glitch protection) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Decision Flow
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HOW DiffHint IS CHOSEN β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Start β
β β β
β βΌ β
β ββββββββββββββββββββ β
β β First frame? ββββββ Yes βββββββββββββββββββββββββ Full β
β ββββββββββ¬ββββββββββ β
β β No β
β βΌ β
β ββββββββββββββββββββ β
β β Size mismatch? ββββββ Yes βββββββββββββββββββββββββ Full β
β ββββββββββ¬ββββββββββ β
β β No β
β βΌ β
β ββββββββββββββββββββ β
β β History changed?ββββββ Yes βββββββββββββββββββββββββ Full β
β ββββββββββ¬ββββββββββ β
β β No β
β βΌ β
β ββββββββββββββββββββ β
β β Glitch detected?ββββββ Yes βββββββββββββββββββββββββ Skip β
β ββββββββββ¬ββββββββββ β
β β No β
β βΌ β
β ββββββββββββββββββββ β
β β Compare lines β β
β ββββββββββ¬ββββββββββ β
β β β
β βββ No changes βββββββββββββββββββββββββββββββ None β
β β β
β βββ < 50% rows changed βββββββββββββββββββββββ Partial β
β β β
β βββ >= 50% rows changed ββββββββββββββββββββββ Full β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Line Comparison: O(1) Speed
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FAST LINE COMPARISON β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Each line has a precomputed signature for instant comparison: β
β β
β What's included in signature: β
β * Character content β
β * Foreground color β
β * Background color β
β * Text attributes (bold, underline, etc.) β
β * Line wrap flag β
β β
β β
β Comparison: O(1) instead of O(cols) β
β β
β β
β Previous State: New State: β
β β
β Line 0: A ================ Line 0: A -> SAME β
β Line 1: B ================ Line 1: B -> SAME β
β Line 2: C =/=/=/=/=/=/=/= Line 2: D -> DIRTY (row 2) β
β Line 3: E ================ Line 3: E -> SAME β
β Line 4: F =/=/=/=/=/=/=/= Line 4: G -> DIRTY (row 4) β
β β
β Result: Partial { dirty_rows: [2, 4] } β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β PERFORMANCE GAIN β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Without fast comparison: β
β 40 rows x 120 cols x 3 fields = 14,400 comparisons β
β β
β With fast comparison: β
β 40 rows x 1 signature = 40 comparisons β
β β
β Speedup: 360x faster β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
True Partial Mode
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATA TRANSMISSION OPTIMIZATION β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β BEFORE (Render Only Partial): β
β ββββββββββββββββββββββββββββββ β
β Rust: Partial { dirty_rows: [5, 10] } β
β BUT lines = ALL 1040 lines β
β β ~50KB sent β
β Frontend: newArray = new Array(1080) <- Full recreation β
β injectLines(ALL 1040 lines) β
β refreshRows(5, 10) <- Only this was partial β
β β
β β
β AFTER (True Partial): β
β βββββββββββββββββββββ β
β Rust: Partial { dirty_rows: [5, 10] } β
β lines = ONLY [line_1005, line_1010] <- 2 lines! β
β β ~0.5KB sent β
β Frontend: SKIP array recreation β
β injectLines(2 dirty lines only) β
β refreshRows(5, 10) β
β β
β β
β RESULTS: β
β β
β Data reduction: 99.95% (50KB -> 0.5KB) β
β Memory allocation: 0 (reused) β
β GC pressure: eliminated β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Rendering Dispatch
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β RENDERING BASED ON DIFFHINT β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Full β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β refreshRows(0, total_rows - 1) β β
β β β β
β β βββββββββββ β β
β β β#########β All rows rendered β β
β β β#########β β β
β β β#########β β β
β β βββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Partial { dirty_rows: [2, 4] } β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β refreshRows(minRow, maxRow) β β
β β β β
β β βββββββββββ β β
β β β.........β rows 0-1: skip β β
β β β#########β rows 2-4: render β β
β β β#########β β β
β β β.........β rows 5+: skip β β
β β βββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β None β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β // No refresh - cursor position only β β
β β β β
β β βββββββββββ β β
β β β.........β Nothing rendered β β
β β β...._....β (cursor update only) β β
β β β.........β β β
β β βββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Skip β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β return false; // Don't apply, don't ACK β β
β β β β
β β βββββββββββ β β
β β β X X X X β Frame discarded β β
β β β X X X X β Wait for valid frame β β
β β β X X X X β β β
β β βββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Skip Mechanism: Glitch Protection
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THE PROBLEM: Oscillation Glitches β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β VTE sometimes produces inconsistent frames during rapid updates: β
β β
β Frame 1: ybase=100 (correct) β
β Frame 2: ybase=0 (WRONG - glitch!) β
β Frame 3: ybase=100 (correct again) β
β β
β If Frame 2 is applied: β
β * All scrollback appears lost β
β * Scroll position jumps to top β
β * User sees flicker/glitch β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β THE SOLUTION: Skip Detection β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Logic: β
β IF history suddenly drops to 0 β
β AND we had history before β
β THEN this is likely a VTE glitch β
β β
β -> Skip the frame, don't apply it β
β -> Wait for next valid frame β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Hint Comparison
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DIFFHINT COMPARISON β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β Full β Partial β None β Skip β
βββββββββββββββββΌββββββββββββββΌββββββββββββββΌββββββββββββββΌββββββββββββββ
β Data valid? β Yes β Yes β Yes β NO (corrupt)β
β Apply frame? β Yes β Yes β Yes β NO β
β Send ACK? β Yes β Yes β Yes β NO β
β Render? β All rows β Dirty rows β Nothing β Nothing β
β Reuse memory? β No β Yes β Yes β Keep prev β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Performance Summary
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SCENARIO: H=1000, V=40, typing one character β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Without optimization: β
β Lines sent: 1040 (all H+V) β
β Data: ~50KB per keystroke β
β β
β With optimization: β
β Lines sent: 1 (dirty only) β
β Data: ~0.05KB per keystroke β
β β
β REDUCTION: 99.9% β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β MODE COMPARISON β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Mode β Lines Sent β IPC Data β Reuse Memory β GC Pressureβ
βββββββββββββββββΌββββββββββββββΌββββββββββββββΌβββββββββββββββΌβββββββββββββ
β Full β H + V β ~50KB β No β High β
β Partial β dirty only β ~0.5KB β Yes β None β
β None β 0 β ~0.1KB β Yes β None β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Typical Use Cases
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USE CASE ANALYSIS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Typing in shell: β
β DiffHint: Partial { dirty_rows: [cursor_y] } β
β Data: ~0.05KB β
β Render: 2.5% of screen β
β β
β Running `ls`: β
β DiffHint: Full (new output) β
β Data: ~50KB β
β Render: 100% β
β β
β Cursor blink: β
β DiffHint: None β
β Data: ~0.1KB β
β Render: 0% β
β β
β vim scroll: β
β DiffHint: Full (rapid content change) β
β Data: ~50KB β
β Render: 100% β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Summary
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DIFF RENDERING SUMMARY β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β [OK] Smart Detection: β
β - O(1) line comparison β
β - 360x faster than cell-by-cell β
β β
β [OK] True Partial Mode: β
β - Only dirty lines transmitted β
β - 99.95% data reduction β
β β
β [OK] Memory Reuse: β
β - No allocation in Partial/None mode β
β - Zero GC pressure β
β β
β [OK] Glitch Protection: β
β - Skip detects invalid frames β
β - Prevents visual artifacts β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
DiffHint System
The DiffHint enum (Full, Partial, None, Skip) enables intelligent rendering decisions. Built in Rust for speed, the system achieves O(1) line comparison and 99.95% data reduction.