• v1.11.6 48f9af0824

    perf: RDP dirty rectangle tracking — partial frame transfer
    Some checks failed
    Build & Sign Wraith / Build Windows + Sign (push) Failing after 7s

    Ghost released this 2026-03-30 14:38:26 +00:00 | 14 commits to main since this release

    Root cause: Every GraphicsUpdate copied the full 8.3MB decoded image
    into the front buffer, cloned all 8.3MB for IPC, and transferred all
    8.3MB to the frontend — even when only a 100x100 pixel region changed.
    During window drag, this created a 25MB/frame pipeline backup.

    Fix:

    • Track dirty rectangles from ironrdp's GraphicsUpdate(InclusiveRectangle)
    • Write path: only copy changed rows from decoded image to front buffer
      (e.g. 100 rows × 1920 pixels = 768KB vs 8.3MB full frame)
    • Accumulate dirty region as union of all rects since last get_frame
    • Read path: if dirty region < 50% of frame, extract only the dirty
      rectangle bytes; otherwise fall back to full frame
    • Binary IPC format: 8-byte header [x,y,w,h as u16 LE] + pixel data
    • Frontend: putImageData at dirty rect offset instead of full frame
    • Status bar: h-9 text-sm for 3440x1440 readability

    During window drag (typical 300x400 dirty rect):
    Before: 8.3MB write + 8.3MB clone + 8.3MB IPC = 24.9MB per frame
    After: 480KB write + 480KB extract + 480KB IPC = 1.4MB per frame
    ~17x reduction in data movement per frame.

    Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

    Downloads