no message
This commit is contained in:
32
player.html
32
player.html
@@ -1662,13 +1662,35 @@
|
|||||||
// 目标帧率 120 FPS,不再使用 setTimeout 限流,而是全力渲染
|
// 目标帧率 120 FPS,不再使用 setTimeout 限流,而是全力渲染
|
||||||
const targetFPS = 120;
|
const targetFPS = 120;
|
||||||
|
|
||||||
|
let isRendering = false; // 防止堆叠
|
||||||
|
|
||||||
|
// FPS 计算变量
|
||||||
|
let frameCount = 0;
|
||||||
|
let lastFpsTime = Date.now();
|
||||||
|
|
||||||
async function renderLoop() {
|
async function renderLoop() {
|
||||||
if (!isMVRecording) return;
|
if (!isMVRecording) return;
|
||||||
|
|
||||||
|
// 计算并打印 FPS
|
||||||
|
frameCount++;
|
||||||
|
const now = Date.now();
|
||||||
|
if (now - lastFpsTime >= 1000) {
|
||||||
|
console.log(`Recording FPS: ${frameCount}`);
|
||||||
|
frameCount = 0;
|
||||||
|
lastFpsTime = now;
|
||||||
|
}
|
||||||
|
|
||||||
// 标记开始处理
|
// 标记开始处理
|
||||||
const beginTime = Date.now();
|
const beginTime = Date.now();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 如果上一帧还没处理完,直接跳过这一帧,防止 UI 线程卡死
|
||||||
|
if (isRendering) {
|
||||||
|
requestAnimationFrame(renderLoop);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
isRendering = true;
|
||||||
const source = document.querySelector('.main-container');
|
const source = document.querySelector('.main-container');
|
||||||
if (source) {
|
if (source) {
|
||||||
// 恢复高清录制,限制最大 dpr 为 2 以平衡性能
|
// 恢复高清录制,限制最大 dpr 为 2 以平衡性能
|
||||||
@@ -1689,24 +1711,18 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('canvas', canvas);
|
|
||||||
|
|
||||||
// 将捕捉到的画面绘制到录制画布上
|
// 将捕捉到的画面绘制到录制画布上
|
||||||
mvCtx.clearRect(0, 0, mvCanvas.width, mvCanvas.height);
|
mvCtx.clearRect(0, 0, mvCanvas.width, mvCanvas.height);
|
||||||
mvCtx.drawImage(canvas, 0, 0, mvCanvas.width, mvCanvas.height);
|
mvCtx.drawImage(canvas, 0, 0, mvCanvas.width, mvCanvas.height);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Frame capture error:', e);
|
console.error('Frame capture error:', e);
|
||||||
|
} finally {
|
||||||
|
isRendering = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 不再使用 setTimeout 进行延时,避免 JS 定时器精度问题导致的抖动
|
|
||||||
// 直接请求下一帧,让浏览器决定最佳时机(通常是 60Hz,如果设备支持高刷则更高)
|
|
||||||
// 这样可以消除人为引入的卡顿
|
|
||||||
console.log('isMVRecording', isMVRecording);
|
|
||||||
if (isMVRecording) {
|
if (isMVRecording) {
|
||||||
mvRafId = requestAnimationFrame(renderLoop);
|
mvRafId = requestAnimationFrame(renderLoop);
|
||||||
console.log('mvRafId', mvRafId);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mvRafId = requestAnimationFrame(renderLoop);
|
mvRafId = requestAnimationFrame(renderLoop);
|
||||||
|
|||||||
Reference in New Issue
Block a user