【发布时间】:2021-10-14 09:41:58
【问题描述】:
所以我有一个我一直在做的项目,它的目标是在 2D 平面上随机生成地形,并在背景中放置雨,我选择使用 html5 画布元素来完成这个目标。创建它后,我对结果感到满意,但我遇到了性能问题,可以就如何修复它提出一些建议。到目前为止,我试图只清除需要的画布位,它位于我在地形下绘制的矩形上方以填充它,但正因为如此,我必须重新绘制圆圈。 rn(rain number) 已经降低了大约 2 倍,仍然滞后,有什么建议吗?
注意 - sn-p 中的代码不会因为它的小尺寸而滞后,但如果我以实际降雨数(800)全屏运行它,它会滞后。我缩小了值以适应 sn-p。
var canvas = document.getElementById('gamecanvas');
var c = canvas.getContext('2d');
var ma = Math.random;
var mo = Math.round;
var wind = 5;
var rn = 100;
var rp = [];
var tp = [];
var tn;
function setup() {
//fillstyle
c.fillStyle = 'black';
//canvas size
canvas.height = window.innerHeight;
canvas.width = window.innerWidth;
//rain setup
for (i = 0; i < rn; i++) {
let x = mo(ma() * canvas.width);
let y = mo(ma() * canvas.width);
let w = mo(ma() * 1) + 1;
let s = mo(ma() * 5) + 10;
rp[i] = { x, y, w, s };
}
//terrain setup
tn = (canvas.width) + 20;
tp[0] = { x: -2, y: canvas.height - 50 };
for (i = 1; i <= tn; i++) {
let x = tp[i - 1].x + 2;
let y = tp[i - 1].y + (ma() * 20) - 10;
if (y > canvas.height - 50) {
y = tp[i - 1].y -= 1;
}
if (y < canvas.height - 100) {
y = tp[i - 1].y += 1;
}
tp[i] = { x, y };
c.fillRect(x, y, 4, canvas.height - y);
}
}
function gameloop() {
//clearing canvas
for (i = 0; i < tn; i++) {
c.clearRect(tp[i].x - 2, 0, 2, tp[i].y);
}
for (i = 0; i < rn; i++) {
//rain looping
if (rp[i].y > canvas.height + 5) {
rp[i].y = -5;
}
if (rp[i].x > canvas.width + 5) {
rp[i].x = -5;
}
//rain movement
rp[i].y += rp[i].s;
rp[i].x += wind;
//rain drawing
c.fillRect(rp[i].x, rp[i].y, rp[i].w, 6);
}
for (i = 0; i < tn; i++) {
//terrain drawing
c.beginPath();
c.arc(tp[i].x, tp[i].y, 6, 0, 7);
c.fill();
}
}
setup();
setInterval(gameloop, 1000 / 60);
body {
background-color: white;
overflow: hidden;
margin: 0;
}
canvas {
background-color: white;
}
<html>
<head>
<link rel="stylesheet" href="index.css">
<title>A Snowy Night</title>
</head>
<body id="body"> <canvas id="gamecanvas"></canvas>
<script src="index.js"></script>
</body>
</html>
【问题讨论】:
-
@Calculuswhiz 使用 2 个画布叠加(1 个用于地形,1 个用于下雨),您只需绘制一次地形
-
@Wax 我该怎么做?
-
@FireRed 与 CSS,请随时在下面的答案中查看。
标签: javascript performance canvas drawing processing-efficiency