您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Prevents re-drawing when inactive to save CPU.
// ==UserScript== // @name Fpuzzles-cpu // @namespace crul-scripts // @version 1.1 // @description Prevents re-drawing when inactive to save CPU. // @author Rangsk // @match https://*.f-puzzles.com/* // @match https://f-puzzles.com/* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // @run-at document-start // ==/UserScript== // Script idea is inspired by @Crul on the CTC Discord. (function() { 'use strict'; const doShim = function() { let drawDirty = false; const origRequestAnimationFrame = window.requestAnimationFrame; const origDrawScreen = drawScreen; drawScreen = function(step, forced) { origDrawScreen(step, forced); drawDirty = false; } const setDrawDirty = function() { if (!drawDirty) { drawDirty = true; origRequestAnimationFrame(drawScreen); } } let firstDraw = true; window.requestAnimationFrame = function(callback) { if (firstDraw) { origRequestAnimationFrame(callback); updateTimer(); firstDraw = false; } } // Mark dirty once per second for the timer const updateTimer = function() { setDrawDirty(); setTimeout(updateTimer, 1000); } // Mark dirty after all user input const origOnInputEnd = onInputEnd; onInputEnd = function() { origOnInputEnd(); setDrawDirty(); } const origOnMouseMove = document.onmousemove; let prevHoveredButton = null; let prevMouseX = null; let prevMouseY = null; document.onmousemove = function(mouse) { let result = origOnMouseMove(mouse); let mouseMoved = prevMouseX !== mouseX || prevMouseY !== mouseY; prevMouseX = mouseX; prevMouseY = mouseY; if (holding && !testPaused() && !disableInputs) { setDrawDirty(); } if (mouseMoved) { let curHoveredButton = null; for (let sidebar of sidebars) { for (let button of sidebar.buttons) { if (button.hovering()) { curHoveredButton = button; break; } } if (curHoveredButton) { break; } } if (!curHoveredButton) { for (let button of buttons) { if (button.hovering()) { curHoveredButton = button; break; } } } if (curHoveredButton !== prevHoveredButton || curHoveredButton && descriptions[curHoveredButton.id] || prevHoveredButton && descriptions[prevHoveredButton.id]) { setDrawDirty(); prevHoveredButton = curHoveredButton; } } return result; } const prevClosePopups = closePopups; closePopups = function() { prevClosePopups(); setDrawDirty(); } } if (window.grid) { doShim(); } else { document.addEventListener('DOMContentLoaded', (event) => { doShim(); }); } })();