Simulation vs Presentation
This page explores a fundamental pattern shared between game engines and MonoTermβs terminal architecture: separating the βtruthβ (simulation/state) from its βpresentationβ (rendering/display).The Core Insight
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β "THE WORLD DOESN'T STOP JUST BECAUSE YOU BLINKED" β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β In games: β
β * The ball keeps moving even if the screen can't show every position β
β * Physics simulation is the TRUTH β
β * Rendered frames are just SNAPSHOTS of that truth β
β β
β In terminals: β
β * Characters keep arriving even if the screen can't show every updateβ
β * Grid state is the TRUTH β
β * Screen updates are just SNAPSHOTS of that truth β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β THE PATTERN: β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β SIMULATION (Backend) PRESENTATION (Frontend) β β
β β ==================== ====================== β β
β β β β
β β * Runs continuously * Runs when possible β β
β β * Never skips * May skip/delay β β
β β * Is the "truth" * Shows the "truth" β β
β β * Deterministic * Best-effort β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Game Engine Frame Management
The Fixed Timestep Pattern
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β GAME ENGINE: PHYSICS vs RENDERING β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β β
β TIME ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΆ β
β β
β PHYSICS (Fixed 60Hz - NEVER skips): β
β β
β ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ β
β β P1 β β P2 β β P3 β β P4 β β P5 β β P6 β β P7 β β P8 β β P9 β βP10 β β
β ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ β
β β β β β β β β β β β β
β v v v v v v v v v v β
β 16.6ms 16.6ms 16.6ms 16.6ms 16.6ms 16.6ms 16.6ms 16.6ms 16.6ms 16.6msβ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β RENDERING (Variable - MAY skip): β
β β
β ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ β
β β R1 β β R2 β β R4 β β R7 β β R8 β βR10 β β
β ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ β
β β β ^ β ^ ^ β β ^ β β
β β β β β β β β β β β β
β β β SKIP! β SKIP! SKIP! β β SKIP! β β
β β β (GPU β (GPU busy) β β (GPU β
β β β busy) β β β busy) β β
β v v v v v v β
β β
β WHAT USER SEES: β
β β
β Frame 1 βββΆ Frame 2 ββββββββββββΆ Frame 4 βββββββββββββΆ Frame 7 βββΆ ...β
β β β β
β Interpolated Interpolated β
β (smooth jump) (smooth jump) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The Spiral of Death
Why clamping is essential to prevent infinite loops.Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THE SPIRAL OF DEATH: Why Clamping is Essential β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β β
β WITHOUT CLAMP: β
β β
β Frame takes 200ms (huge lag spike) β
β β β
β v β
β Need 12 physics steps to catch up! β
β β β
β v β
β 12 steps take 100ms... β
β β β
β v β
β Now still behind! β
β β β
β v β
β INFINITE LOOP - GAME FREEZES β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β WITH CLAMP (max 250ms): β
β β
β Frame takes 500ms β
β β β
β v β
β Clamp to 250ms β
β β β
β v β
β 250ms of simulation SKIPPED (acknowledged loss) β
β β β
β v β
β Game continues from new baseline β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β PHILOSOPHY: β
β β
β "It's better to lose some simulation time than to freeze forever" β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β RECOVERABLE vs UNRECOVERABLE β β
β β ββββββββββββ βββββββββββββ β β
β β Skip 250ms of physics Infinite freeze loop β β
β β User notices a "jump" Game is dead β β
β β Game continues Must force quit β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
MonoTerm ACK Gate Pattern
The terminal equivalent of game frame management.Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MONOTERM: VTE PARSING vs GRID UPDATES β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β β
β TIME ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΆ β
β β
β VTE PARSING (Continuous - NEVER stops): β
β β
β ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ β
β β V1 β β V2 β β V3 β β V4 β β V5 β β V6 β β V7 β β V8 β β V9 β βV10 β β
β ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ ββββββ β
β β β β β β β β β β β β
β v v v v v v v v v v β
β Parse Parse Parse Parse Parse Parse Parse Parse Parse Parse β
β "ls" "-la" "\n" "foo" "bar" ... ... ... ... ... β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β GRID UPDATES (ACK-gated - MAY wait): β
β β
β ββββββ ββββββ ββββββ ββββββ ββββββ ββββββββββββββββββββββ ββββββ βββββββ
β β G1 β β G2 β βWAITβ βWAITβ βWAITβ β G3 (batched) β β G4 β β G5 ββ
β ββββββ ββββββ ββββββ ββββββ ββββββ ββββββββββββββββββββββ ββββββ βββββββ
β β β β β β β
β β β ^ ^ ^ β β β β
β β β β β β β β β β
β β β waiting_for_ack = true β β β β
β β β (Frontend processing G2) β β β β
β v v v v v β
β Send Send Send Send Send β
β β β β
β βββββββ ACK βββββββββββββββββββββββββββ β
β received! β
β β
β WHAT USER SEES: β
β β
β Update 1 βββΆ Update 2 βββββββββββββββββββΆ Update 3 βββΆ Update 4 βββΆ...β
β β β
β Batched β
β (contains V3,V4,V5,V6 changes) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Side-by-Side Comparison
The Two Loops
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β GAME LOOP vs TERMINAL LOOP β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β β
β βββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββ
β β GAME LOOP β β MONOTERM LOOP β
β β β β β
β β while (running) { β β while (session_active) { β
β β β β β
β β // Time management β β // Data management β
β β dt = get_delta_time(); β β data = pty.read(); β
β β accumulator += dt; β β grid.update(data); β
β β β β β
β β // Fixed timestep physics β β // Continuous VTE parsing β
β β while (acc >= FIXED_DT) { β β // (always runs) β
β β physics_step(FIXED_DT); β β β
β β acc -= FIXED_DT; β β β
β β } β β β
β β β β // ACK-gated sending β
β β // Render when possible β β if (!waiting_for_ack) { β
β β alpha = acc / FIXED_DT; β β send_grid_update(); β
β β render(interpolate(alpha)); β β waiting_for_ack = true; β
β β β β } else { β
β β β β has_pending = true; β
β β β β } β
β β } β β } β
β β β β β
β βββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββ
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β KEY INSIGHT: Both patterns solve PRODUCER-CONSUMER synchronization β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β PRODUCER MEDIATOR CONSUMER β β
β β ββββββββ ββββββββ ββββββββ β β
β β β β
β β Game: β β
β β Physics ββββββββΆ Accumulator ββββββββΆ Renderer β β
β β (fixed) (time storage) (variable) β β
β β β β
β β MonoTerm: β β
β β VTE Parser ββββββββΆ Grid State ββββββββΆ xterm.js β β
β β (continuous) (cell storage) (ACK-gated) β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Truth vs Presentation
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β "SOURCE OF TRUTH" ARCHITECTURE β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β SOURCE OF TRUTH β β
β β ================ β β
β β β β
β β Game: Physics State MonoTerm: Grid State β β
β β βββββββββββββββββββββ βββββββββββββββββββββ β β
β β β ball.x = 150 β β cell[0] = 'A' β β β
β β β ball.y = 200 β β cell[1] = 'B' β β β
β β β ball.vx = 5 β β cursor = (5,10) β β β
β β β ball.vy = -3 β β fg = red β β β
β β βββββββββββββββββββββ βββββββββββββββββββββ β β
β β β β β β
β β β Always β Always β β
β β β up-to-date β up-to-date β β
β β β β β β
β β ββββββββββͺβββββββββββββββββββββββββββββͺβββββββββββββββββββββββββ£ β
β β β β
β v v β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β PRESENTATION β β
β β ============ β β
β β β β
β β Game: Rendered Frame MonoTerm: xterm.js View β β
β β βββββββββββββββββββββ βββββββββββββββββββββ β β
β β β o β β $ ls -la β β β
β β β \ β β foo bar baz β β β
β β β \ β β β β β
β β β * β β β β β
β β βββββββββββββββββββββ βββββββββββββββββββββ β β
β β β β β β
β β β May be β May be β β
β β β outdated β outdated β β
β β β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
β THE KEY PRINCIPLE: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β "The presentation is a SNAPSHOT of the truth, β β
β β not the truth itself. β β
β β β β
β β Missing a snapshot doesn't change the truth. β β
β β The truth continues regardless of whether we can show it." β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Skip vs Delay vs Batch
Three strategies for handling overwhelming data.Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HANDLING BACKPRESSURE: THREE APPROACHES β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β β
β INPUT: [A] [B] [C] [D] [E] [F] [G] [H] [I] [J] β
β (10 updates, consumer can only handle 5) β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β STRATEGY 1: SKIP (Game Frames) β
β β
β OUTPUT: [A] [B] βββ βββ [E] [F] βββ βββ [I] [J] β
β ^ ^ β
β β β β
β C,D lost G,H lost β
β β
β OK Constant latency β
β OK Never falls behind β
β X Data permanently lost β
β X Requires interpolation for smoothness β
β β
β USE WHEN: Visual continuity matters more than exact accuracy β
β (games, video, animation) β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β STRATEGY 2: DELAY (Simple Queue) β
β β
β OUTPUT: [A] [B] [C] [D] [E] ... (eventually) ... [F] [G] [H] [I] [J] β
β ^ β
β β β
β Growing delay β
β β
β OK No data loss β
β X Unbounded latency β
β X Can cause memory exhaustion β
β X User sees increasingly stale data β
β β
β USE WHEN: Every piece of data is critical and timing doesn't matter β
β (file transfers, logging) β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β STRATEGY 3: BATCH (MonoTerm ACK Gate) β
β β
β OUTPUT: [A] [B] [C+D+E+F] [G] [H+I+J] β
β ^ ^ β
β β β β
β Batched into Batched into β
β single update single update β
β β
β OK No data loss β
β OK Bounded latency (waits for ACK, not queue) β
β OK Efficient (fewer IPC calls) β
β OK Latest state always shown β
β β
β USE WHEN: All data matters AND latest state is most important β
β (terminals, real-time editors, collaborative tools) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Why Terminals Need Batching, Not Skipping
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β WHY TERMINALS CAN'T USE GAME-STYLE FRAME SKIPPING β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β β
β GAME: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Frame 1: Ball at (100, 100) β β
β β Frame 2: Ball at (110, 105) <ββ SKIPPED β β
β β Frame 3: Ball at (120, 110) <ββ SKIPPED β β
β β Frame 4: Ball at (130, 115) <ββ SHOWN β β
β β β β
β β User sees: Ball "jumps" from (100,100) to (130,115) β β
β β With interpolation: Smooth movement β β
β β β β
β β IS THIS OK? OK YES - position (110,105) was just intermediate β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β TERMINAL: β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Update 1: "$ ls" β β
β β Update 2: "\n" <ββ SKIPPED? β β
β β Update 3: "foo bar" <ββ SKIPPED? β β
β β Update 4: "\n$ " <ββ SHOWN β β
β β β β
β β User sees: "$ ls\n$ " β β
β β MISSING: "foo bar" (the actual output!) β β
β β β β
β β IS THIS OK? X NO - "foo bar" is CRITICAL information β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β THE DIFFERENCE: β
β β
β βββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ β
β β GAME β TERMINAL β β
β βββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ€ β
β β Each frame = position snapshot β Each update = NEW information β β
β β Intermediate frames redundant β Every character matters β β
β β Final position is what counts β All characters must be shown β β
β β Can interpolate between states β Cannot "interpolate" charactersβ β
β βββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β MONOTERM SOLUTION: β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Batch updates, don't skip them β β
β β β β
β β Update 1: "$ ls" βββΆ SEND β β
β β Update 2: "\n" ] β β
β β Update 3: "foo bar" ]βββββΆ BATCH into single update β β
β β Update 4: "\n$ " ] β β
β β β β
β β User sees: Everything, just slightly delayed β β
β β Nothing is lost β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The Universal Principle
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β THE SIMULATION-PRESENTATION SEPARATION PRINCIPLE β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β 1. Simulation (Backend) owns the TRUTH β β
β β - Runs at its own pace β β
β β - Never stops for presentation β β
β β - State is always consistent β β
β β β β
β β 2. Presentation (Frontend) shows SNAPSHOTS β β
β β - Runs when resources allow β β
β β - May skip, delay, or batch β β
β β - Decoupled from simulation timing β β
β β β β
β β 3. A MEDIATOR absorbs timing differences β β
β β - Prevents producer from blocking β β
β β - Allows consumer to catch up β β
β β β β
β β 4. BACKPRESSURE prevents system collapse β β
β β - Acknowledges consumer capacity limits β β
β β - Gracefully degrades (skip/delay/batch) β β
β β - Prevents unbounded queue growth β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
β APPLICATIONS OF THIS PRINCIPLE: β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Domain β Simulation β Presentation β Strategy β β
β β βββββββββββββββββΌβββββββββββββββββββΌββββββββββββββββΌβββββββββββββ β β
β β Games β Physics engine β Renderer β Skip+Interp β β
β β Video Streaming β Source video β Player β Adaptive β β
β β Terminals β VTE parser β Display β Batch β β
β β Real-time DBs β Write log β Query results β Snapshot β β
β β Financial β Order book β Charts β Throttle β β
β β IoT Sensors β Measurements β Dashboard β Sample β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Summary
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SUMMARY β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β β
β Q: "Is it the same pattern - simulation continues, only frames drop?"β
β β
β A: YES. Exactly the same principle: β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β GAME: Physics runs βββΆ Render may skip βββΆ Interpolate β β
β β MONOTERM: VTE parses βββΆ Send may wait βββΆ Batch β β
β β β β
β β Both: Backend TRUTH never stops β β
β β Both: Frontend PRESENTATION adapts to capacity β β
β β Both: MEDIATOR absorbs timing mismatches β β
β β Both: BACKPRESSURE prevents system collapse β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β KEY DIFFERENCE: β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Games SKIP frames (visual continuity, can interpolate) β β
β β Terminals BATCH updates (every character matters) β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β THE MONOTERM PHILOSOPHY: β
β β
β "The PTY never stops. The VTE parser never stops. β
β Only the presentation waits for the consumer. β
β The truth continues, whether or not anyone is watching." β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ