javascript - Javascript [CANVAS]“减慢帧率?”
问题描述
你好吗?我正在努力解决我的代码遇到的一个小问题。我被要求用 javascript 创建一个绘画程序,我快到了,但我正在为它的绘画速度而苦苦挣扎。我让它绘画,以便它在客户端 x 和 y 位置的每个 mouseDrag 事件上绘制一些东西。
看看示例油漆的形状是如何定义的,你可以看到每一个,这是我在画布上绘制后的程序。
这是我的,它画得太快了。
if(dragging && type.options[type.selectedIndex].value == "squares") {
ctx.lineTo(e.clientX, e.clientY);
ctx.lineWidth = 5;
ctx.beginPath();
ctx.rect(e.clientX, e.clientY, 40, 40);
ctx.fill();
ctx.fillStyle = "yellow";
ctx.beginPath();
ctx.moveTo(e.clientX, e.clientY);
}
解决方案
您可以节省每次绘制的时间,并且每当您可能再次绘制时,请检查自上次绘制以来是否已经过了足够的时间。
这是一个例子:
const ctx = document.getElementById('canvas').getContext('2d');
const speedInput = document.getElementById('draw-speed');
let buffer = +speedInput.value;
let lastPaint;
ctx.canvas.onmousemove = ({ x, y }) => {
const now = Date.now();
if (!lastPaint || (now - lastPaint) > buffer) {
lastPaint = now;
ctx.fillRect(x, y, 10, 10);
}
};
speedInput.onchange = ({ target }) => {
buffer = +target.value;
};
canvas {
border: 1px solid black;
}
label {
display: block;
}
<canvas id="canvas"></canvas>
<label for="draw-speed">Draw speed</label>
<select id="draw-speed">
<option>0</option>
<option>50</option>
<option selected>100</option>
<option>150</option>
</select>
推荐阅读
- java - 为什么 StepVerifer 虚拟时间不适用于 Flux?
- flutter - Navigator 上的 Flutter Provider 注入多个对象
- python - Selenium - webdriver - Python - 复制 webdriver 脚本并通过从 excel 中更改一些值来运行到另一个选项卡,例如
- arrays - 数组中所有成对整数和的异或
- c - 如何在程序中添加倒数计时器?
- c# - 从视频文件中提取音频的问题(android)
- python - 在数据框的列中查找列表的任何单词
- smalltalk - 从 Smalltalk 中的数组中选择随机元素
- xml - 如何合并元素并将它们分组
- json - 循环API多个参数