From 8664c1a60f894e58ca27e9ab76b9ca5ca82689aa Mon Sep 17 00:00:00 2001 From: redphx <96280+redphx@users.noreply.github.com> Date: Sat, 19 Oct 2024 18:04:05 +0700 Subject: [PATCH] Fix taking screenshot not working when limiting FPS --- dist/better-xcloud.lite.user.js | 14 ++++++++------ dist/better-xcloud.user.js | 16 +++++++++------- src/modules/player/webgl2-player.ts | 26 ++++++++++++++------------ src/utils/screenshot.ts | 2 +- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/dist/better-xcloud.lite.user.js b/dist/better-xcloud.lite.user.js index cfe64ce..cfd69db 100644 --- a/dist/better-xcloud.lite.user.js +++ b/dist/better-xcloud.lite.user.js @@ -5036,12 +5036,14 @@ class WebGL2Player { let gl = this.gl, program = this.program; gl.uniform2f(gl.getUniformLocation(program, "iResolution"), this.$canvas.width, this.$canvas.height), gl.uniform1i(gl.getUniformLocation(program, "filterId"), this.options.filterId), gl.uniform1f(gl.getUniformLocation(program, "sharpenFactor"), this.options.sharpenFactor), gl.uniform1f(gl.getUniformLocation(program, "brightness"), this.options.brightness), gl.uniform1f(gl.getUniformLocation(program, "contrast"), this.options.contrast), gl.uniform1f(gl.getUniformLocation(program, "saturation"), this.options.saturation); } - drawFrame() { - if (this.targetFps === 0) return; - if (this.targetFps < 60) { - let currentTime = performance.now(); - if (currentTime - this.lastFrameTime < this.frameInterval) return; - this.lastFrameTime = currentTime; + drawFrame(force = !1) { + if (!force) { + if (this.targetFps === 0) return; + if (this.targetFps < 60) { + let currentTime = performance.now(); + if (currentTime - this.lastFrameTime < this.frameInterval) return; + this.lastFrameTime = currentTime; + } } let gl = this.gl; gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, this.$video), gl.drawArrays(gl.TRIANGLES, 0, 6); diff --git a/dist/better-xcloud.user.js b/dist/better-xcloud.user.js index cacc706..9e80eaa 100644 --- a/dist/better-xcloud.user.js +++ b/dist/better-xcloud.user.js @@ -1814,7 +1814,7 @@ class Screenshot { if (!$player || !$player.isConnected) return; $player.parentElement.addEventListener("animationend", this.#onAnimationEnd, { once: !0 }), $player.parentElement.classList.add("bx-taking-screenshot"); let canvasContext = Screenshot.#canvasContext; - if ($player instanceof HTMLCanvasElement) streamPlayer.getWebGL2Player().drawFrame(); + if ($player instanceof HTMLCanvasElement) streamPlayer.getWebGL2Player().drawFrame(!0); if (canvasContext.drawImage($player, 0, 0, $canvas.width, $canvas.height), AppInterface) { let data = $canvas.toDataURL("image/png").split(";base64,")[1]; AppInterface.saveScreenshot(currentStream.titleSlug, data), canvasContext.clearRect(0, 0, $canvas.width, $canvas.height), callback && callback(); @@ -6915,12 +6915,14 @@ class WebGL2Player { let gl = this.gl, program = this.program; gl.uniform2f(gl.getUniformLocation(program, "iResolution"), this.$canvas.width, this.$canvas.height), gl.uniform1i(gl.getUniformLocation(program, "filterId"), this.options.filterId), gl.uniform1f(gl.getUniformLocation(program, "sharpenFactor"), this.options.sharpenFactor), gl.uniform1f(gl.getUniformLocation(program, "brightness"), this.options.brightness), gl.uniform1f(gl.getUniformLocation(program, "contrast"), this.options.contrast), gl.uniform1f(gl.getUniformLocation(program, "saturation"), this.options.saturation); } - drawFrame() { - if (this.targetFps === 0) return; - if (this.targetFps < 60) { - let currentTime = performance.now(); - if (currentTime - this.lastFrameTime < this.frameInterval) return; - this.lastFrameTime = currentTime; + drawFrame(force = !1) { + if (!force) { + if (this.targetFps === 0) return; + if (this.targetFps < 60) { + let currentTime = performance.now(); + if (currentTime - this.lastFrameTime < this.frameInterval) return; + this.lastFrameTime = currentTime; + } } let gl = this.gl; gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, this.$video), gl.drawArrays(gl.TRIANGLES, 0, 6); diff --git a/src/modules/player/webgl2-player.ts b/src/modules/player/webgl2-player.ts index 811a7bf..ffd80ad 100644 --- a/src/modules/player/webgl2-player.ts +++ b/src/modules/player/webgl2-player.ts @@ -94,20 +94,22 @@ export class WebGL2Player { gl.uniform1f(gl.getUniformLocation(program, 'saturation'), this.options.saturation); } - drawFrame() { - // Don't draw when FPS is 0 - if (this.targetFps === 0) { - return; - } - - // Limit FPS - if (this.targetFps < 60) { - const currentTime = performance.now(); - const timeSinceLastFrame = currentTime - this.lastFrameTime; - if (timeSinceLastFrame < this.frameInterval) { + drawFrame(force=false) { + if (!force) { + // Don't draw when FPS is 0 + if (this.targetFps === 0) { return; } - this.lastFrameTime = currentTime; + + // Limit FPS + if (this.targetFps < 60) { + const currentTime = performance.now(); + const timeSinceLastFrame = currentTime - this.lastFrameTime; + if (timeSinceLastFrame < this.frameInterval) { + return; + } + this.lastFrameTime = currentTime; + } } const gl = this.gl!; diff --git a/src/utils/screenshot.ts b/src/utils/screenshot.ts index 32fb1f8..d9f59cd 100644 --- a/src/utils/screenshot.ts +++ b/src/utils/screenshot.ts @@ -64,7 +64,7 @@ export class Screenshot { const canvasContext = Screenshot.#canvasContext; if ($player instanceof HTMLCanvasElement) { - streamPlayer.getWebGL2Player().drawFrame(); + streamPlayer.getWebGL2Player().drawFrame(true); } canvasContext.drawImage($player, 0, 0, $canvas.width, $canvas.height);