From f9f5b01cc23f3084f83ccf15c144de130b8b3222 Mon Sep 17 00:00:00 2001 From: Lauri Kasanen Date: Tue, 27 Jul 2021 15:28:02 +0300 Subject: [PATCH] Initial frame stat tracking --- core/display.js | 13 +++++++++++++ core/rfb.js | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/core/display.js b/core/display.js index 30fa2891..dd14a6a2 100644 --- a/core/display.js +++ b/core/display.js @@ -21,6 +21,8 @@ export default class Display { this._fbWidth = 0; this._fbHeight = 0; + this._renderMs = 0; + this._prevDrawStyle = ""; Log.Debug(">> Display.constructor"); @@ -91,6 +93,13 @@ export default class Display { return this._fbHeight; } + get renderMs() { + return this._renderMs; + } + set renderMs(val) { + this._renderMs = val; + } + // ===== PUBLIC METHODS ===== viewportChangePos(deltaX, deltaY) { @@ -470,6 +479,7 @@ export default class Display { _scanRenderQ() { let ready = true; + let before = Date.now(); while (ready && this._renderQ.length > 0) { const a = this._renderQ[0]; switch (a.type) { @@ -513,5 +523,8 @@ export default class Display { this._flushing = false; this.onflush(); } + + let elapsed = Date.now() - before; + this._renderMs += elapsed; } } diff --git a/core/rfb.js b/core/rfb.js index db774e12..74d97dc7 100644 --- a/core/rfb.js +++ b/core/rfb.js @@ -142,6 +142,8 @@ export default class RFB extends EventTargetMixin { this._maxVideoResolutionX = 960; this._maxVideoResolutionY = 540; + this._trackFrameStats = false; + this._clipboardText = null; this._clipboardServerCapabilitiesActions = {}; this._clipboardServerCapabilitiesFormats = {}; @@ -2250,11 +2252,18 @@ export default class RFB extends EventTargetMixin { let first, ret; switch (msgType) { case 0: // FramebufferUpdate + let before = Date.now(); + this._display.renderMs = 0; ret = this._framebufferUpdate(); if (ret && !this._enabledContinuousUpdates) { RFB.messages.fbUpdateRequest(this._sock, true, 0, 0, this._fbWidth, this._fbHeight); } + let elapsed = Date.now() - before; + if (this._trackFrameStats) { + RFB.messages.sendFrameStats(this._sock, elapsed, this._display.renderMs); + this._trackFrameStats = false; + } return ret; case 1: // SetColorMapEntries @@ -2287,6 +2296,10 @@ export default class RFB extends EventTargetMixin { case 178: // KASM bottleneck stats return this._handle_server_stats_msg(); + case 179: // KASM requesting frame stats + this._trackFrameStats = true; + return true; + case 248: // ServerFence return this._handleServerFenceMsg(); @@ -3035,6 +3048,32 @@ RFB.messages = { sock.flush(); }, + sendFrameStats(sock, allMs, renderMs) { + const buff = sock._sQ; + const offset = sock._sQlen; + + if (buff == null) { return; } + + buff[offset] = 179; // msg-type + + buff[offset + 1] = 0; // padding + buff[offset + 2] = 0; // padding + buff[offset + 3] = 0; // padding + + buff[offset + 4] = allMs >> 24; + buff[offset + 5] = allMs >> 16; + buff[offset + 6] = allMs >> 8; + buff[offset + 7] = allMs; + + buff[offset + 8] = renderMs >> 24; + buff[offset + 9] = renderMs >> 16; + buff[offset + 10] = renderMs >> 8; + buff[offset + 11] = renderMs; + + sock._sQlen += 12; + sock.flush(); + }, + enableContinuousUpdates(sock, enable, x, y, width, height) { const buff = sock._sQ;