// ==UserScript==
// @name MCJS 高版本极限提帧器 (WASM专用)
// @namespace https://scriptcat.org/
// @version 3.0
// @description 针对 Eaglercraft 1.13+ 至 26.3 高版本 WASM,强制降分辨率、关特效,硬核提帧保画质
// @author You
// @match *://*/*
// @grant GM_setValue
// @grant GM_getValue
// @run-at document-start
// ==/UserScript==
(function () {
'use strict';
// ==================== 1. 底层渲染强制降级 (在游戏加载前执行) ====================
// 强行关闭抗锯齿,降低GPU负担,这对于高版本WASM是致命的性能点
const originalGetContext = HTMLCanvasElement.prototype.getContext;
HTMLCanvasElement.prototype.getContext = function (type, attributes) {
if (type === 'webgl' || type === 'webgl2' || type === 'experimental-webgl') {
const optimisedAttributes = Object.assign({}, attributes, {
antialias: false, // 必须关!高版本开抗锯齿直接掉一半帧
powerPreference: "high-performance", // 强制使用独立显卡
alpha: false, // 不透明画布更省性能
depth: true,
stencil: false, // 不用模板缓冲
desynchronized: true, // 开启低延迟渲染 (减少鼠标转头时的拖拽感)
preserveDrawingBuffer: false
});
return originalGetContext.call(this, type, optimisedAttributes);
}
return originalGetContext.call(this, type, attributes);
};
// ==================== 2. 设备分辨率劫持 (超强提帧核心) ====================
// 获取用户保存的 DPR (默认 0.7,即按 70% 分辨率渲染)
let targetDPR = parseFloat(GM_getValue('mc_dpr_v3', '0.7'));
try {
// 劫持 window.devicePixelRatio
Object.defineProperty(window, 'devicePixelRatio', {
get: function () {
return targetDPR;
}
});
} catch (e) {
console.warn("[MC提帧] 无法劫持 DPR,可能被浏览器安全策略限制。");
}
// ==================== 3. 控制面板 UI ====================
function createUI() {
if (document.getElementById('mc-wasm-opt')) return;
const panel = document.createElement('div');
panel.id = 'mc-wasm-opt';
panel.style.cssText = `
position: fixed; bottom: 20px; left: 20px; width: 280px;
background: rgba(10, 15, 25, 0.95); backdrop-filter: blur(10px);
border: 1px solid #00d2ff; border-radius: 12px;
box-shadow: 0 10px 30px rgba(0,0,0,0.8); z-index: 2147483647;
color: #e0e6ed; font-family: "Segoe UI", sans-serif; font-size: 13px;
display: flex; flex-direction: column; overflow: hidden;
user-select: none;
`;
panel.innerHTML = `
`;
document.body.appendChild(panel);
// 拖动逻辑
const header = panel.querySelector('.header');
let isDragging = false, startX, startY, initialX, initialY;
header.addEventListener('mousedown', (e) => {
isDragging = true;
startX = e.clientX; startY = e.clientY;
const rect = panel.getBoundingClientRect();
initialX = rect.left; initialY = rect.top;
panel.style.bottom = 'auto'; panel.style.left = initialX + 'px'; panel.style.top = initialY + 'px';
});
document.addEventListener('mousemove', (e) => {
if (!isDragging) return;
panel.style.left = `${initialX + e.clientX - startX}px`;
panel.style.top = `${initialY + e.clientY - startY}px`;
});
document.addEventListener('mouseup', () => isDragging = false);
// 交互逻辑
const dprSlider = panel.querySelector('#dpr-slider');
const dprVal = panel.querySelector('#dpr-val');
dprSlider.oninput = () => dprVal.textContent = dprSlider.value + 'x';
const sharpenBox = panel.querySelector('#sharpen-box');
sharpenBox.checked = GM_getValue('mc_sharpen_v3', true); // 默认开启锐化
// 应用滤镜的函数
function applySharpen(enable) {
const canvases = document.querySelectorAll('canvas');
canvases.forEach(c => {
if (enable) {
c.style.imageRendering = 'pixelated'; // 关键:保持像素风,防止变糊
c.style.filter = 'contrast(1.15) saturate(1.1)'; // 增强对比和色彩
} else {
c.style.imageRendering = 'auto';
c.style.filter = 'none';
}
});
}
// 初始应用锐化
applySharpen(sharpenBox.checked);
// 监听 DOM,新生成的 Canvas 也应用
const observer = new MutationObserver(() => {
applySharpen(sharpenBox.checked);
});
observer.observe(document.body, { childList: true, subtree: true });
panel.querySelector('#apply-btn').onclick = () => {
const newDpr = parseFloat(dprSlider.value);
const enableSharpen = sharpenBox.checked;
GM_setValue('mc_dpr_v3', newDpr);
GM_setValue('mc_sharpen_v3', enableSharpen);
// 提示并刷新
alert(`已应用优化设置:\\n分辨率缩放:${newDpr}x\\n画面锐化:${enableSharpen ? '开启' : '关闭'}\\n\\n即将刷新页面生效!`);
window.location.reload();
};
}
// ==================== 4. 初始化 ====================
function init() {
// 检测到 Canvas 后再出 UI
const checkCanvas = setInterval(() => {
if (document.querySelector('canvas')) {
createUI();
clearInterval(checkCanvas);
}
}, 500);
// 阻止在画布上右键弹出菜单
document.addEventListener('contextmenu', (e) => {
if (e.target.tagName.toLowerCase() === 'canvas') {
e.preventDefault();
}
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();