javascript - 画布上的视差星星。这对网站来说太多了吗?
问题描述
网络开发新手。我想让星星在页面上移动。但是,我担心这对于一个简单的网站来说可能太多了?或者也许有办法优化代码?
const canvas = document.getElementById('canvas')
const context = canvas.getContext('2d')
const starCount = [700, 200, 100]
const stars = []
window.addEventListener('resize', resizeCanvas, false)
resizeCanvas()
function resizeCanvas() {
canvas.width = window.innerWidth
canvas.height = window.innerHeight
drawStars()
}
function drawStars() {
for (let i = 0, j = starCount.length; i < j; i++) {
for (let k = 0, l = starCount[i]; k < l; k++) {
const x = Math.random() * canvas.width
const y = Math.random() * canvas.height
context.beginPath()
stars.push({ posX: x, posY: y, radius: (i + 1) / 2.5, speed: (3 - i) * 0.25 })
context.arc(x, y, (i + 1) / 2.5, 0, 360)
context.fillStyle = 'white'
context.fill()
}
}
}
drawStars()
function redraw() {
context.clearRect(0, 0, canvas.width, canvas.height)
for (let i = 0, j = stars.length; i < j; i++) {
const speed = stars[i].speed
context.beginPath()
if ((stars[i].posY -= speed) < 0) {
stars[i].posY = canvas.height
} else {
stars[i].posY -= speed
}
context.arc(stars[i].posX, stars[i].posY, stars[i].radius, 0, 360)
context.fillStyle = 'white'
context.fill()
}
}
setInterval(() => {
redraw()
}, 17);
解决方案
这里有很多事情:您必须了解网站的目标受众,才能知道您是否在视线上做得太多。瞄准富人?他们可能有购买好电脑的可支配收入,并且可以处理这项任务。瞄准尽可能广泛的范围?让您的网站根据观众灵活。如果您无法维持高帧速率,则回退到静态图像。
下一个性能:你可以从webgl获得更好的性能,但是你必须爬上webgl的山。
其他性能: setInterval 是重绘循环的坏习惯。使用 requestAnimationFrame 在主 UI 循环上正确进行更改。如果您需要降低帧速率,则跳过一些帧。
画布性能:画布是基于状态的,如果您的状态之前没有更改,则无需重新应用诸如 fillStyle 之类的东西,因此请将它们从循环中取出。您可以通过在条件中不使用评估属性来微优化循环:
for (let i = 0, endi = stars.length; i < endi; ++i)
你可能还有更多的小事可以做...
下一个设计:如果您认为它确实是使您的网站脱颖而出的元素,那么请努力使设计适合所有人。
推荐阅读
- python - 使用 Python 将 0 替换为空单元格
- python - 如何使用预定义的键字符串 python (2.x) 嵌套字典?
- json - hudson.remoting.ProxyException:net.sf.json.JSONException:无效的 JSON 字符串
- generics - 要求字段实现多个接口而不使用类型参数
- python - 如何解决 Matplotlib 的 ValueError 问题 - X 和 y 应该是相同的大小?
- groovy - 如何使用 groovy 代码进行 POST web api 调用?
- java - 如何决定覆盖超类的子类方法?爪哇
- c# - C# ODBC:提高数千个选择查询的性能
- javascript - 给定两个对角点,如何生成形成一个矩形的所有坐标?
- javascript - JS Array of Objects 过滤掉数组中的值