Skip to content

perf(screenshot): Avoid redundant buffers and copies and throttle the probe uploads - #635

Open
tintinhamans wants to merge 2 commits into
GeneralsOnlineDevelopmentTeam:mainfrom
tintinhamans:arctic/go/perf/screenshot-probe-buffers
Open

tintinhamans wants to merge 2 commits into
GeneralsOnlineDevelopmentTeam:mainfrom
tintinhamans:arctic/go/perf/screenshot-probe-buffers

Conversation

@tintinhamans

@tintinhamans tintinhamans commented Oct 9, 2026 •

Copy link
Copy Markdown

CaptureScreenshot read the whole front buffer into a display-sized surface on every capture and never used it. That was a full GPU readback and a 29 MB surface at 5120x1440, and the capture failed whenever GetFrontBuffer did. It is removed.

The pixel conversion and resize now reuse buffers, and the encoded bytes are moved instead of copied through the cache, upload list and S3 PUT. It also drops an Unlock() on the back buffer, which is never locked and made debug builds assert on every capture.

Probe screenshots went out as soon as they were captured and at full upload speed, and every client did that at the same moment, so the uploads competed with the game traffic. While a multiplayer game runs they now go out one slot at a time: a client waits its slot index times screenshot_slot_offset_ms (2000, clamped 0 to 10000) plus up to 500 ms of random jitter, and curl caps the PUT at screenshot_upload_bytes_per_sec (131072, clamped 16384 to 10485760). The wait and the cap are off once no multiplayer game is running and for the score screen screenshot. Both keys come from the service config, a missing key keeps its default.

Tested: builds x86 Release z_generals.

@tintinhamans tintinhamans changed the title perf(screenshot): Avoid redundant buffers and copies in screenshot uploads perf(screenshot): Avoid redundant buffers and copies and throttle the probe uploads Oct 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant