所以我用canvas和javascript(一些jQuery)製作了一個簡單的粒子系統,但我似乎無法讓它在我的舊電腦上運行速度超過8fps,這是代碼:如何使用粒子對象優化畫布粒子系統
var starList = [];
function Star(){
this.x = getRandomInt(0, canvas.width);
this.y = getRandomInt(0, canvas.height);
this.vx = getRandomInt(2,5);
this.size = this.vx/5;
this.opacity = getRandomInt(0, 5000)/10000;
this.color = getRandomFromArray(["239, 207, 174", "162, 184, 229", "255, 255, 255"]);
this.draw = function(){
ctx.fillStyle = "rgba("+this.color+","+this.opacity+")";
ctx.beginPath();
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2, true);
ctx.closePath();
ctx.fill();
},
this.move = function(){
this.x = this.x - this.vx;
if(this.x < 0) {
this.x = canvas.width;
this.opacity = getRandomInt(0, 5000)/10000;
this.color = getRandomFromArray(["239, 207, 174", "162, 184, 229", "255, 255, 255"]);
this.y = getRandomInt(0, canvas.height);
this.size = this.vx/5;
this.vx = getRandomInt(2,5);
}
}
}
var canvas, ctx;
function setCanvas(){
canvas = $('canvas')[0];
ctx = canvas.getContext("2d");
canvas.width = $(window).width()/5;
canvas.height = $(window).height()/5;
}
setCanvas();
function generateStars(){
for(var i = 0; i < 5000; i++){
var star = new Star();
starList.push(star);
}
for(var i = 0; i < starList.length; i++) {
star = starList[i];
star.draw();
}
}
generateStars();
function loop() {
window.requestAnimationFrame(loop);
//clear canvas
ctx.clearRect(0, 0, canvas.width, canvas.height);
//draw and move stars
for(var i = 0; i < starList.length; i++) {
star = starList[i];
star.draw();
star.move();
}
}
我假定使用對象的粒子(星)和通過物的5000索引陣列循環,並執行這兩個函數是硬的處理器/ GPU但如何可以優化此代碼?
我見過其他人避免在構造函數上使用函數,並在它們遍歷數組時循環移動和繪製粒子。這會使它更快嗎?
編輯:忽略getRandomInt和類似的功能,他們是我用來生成隨機東西的簡單功能。
除了它是一個不完整的列表和想法不能被測試,只是轉發給你 - 看起來顯而易見的一點似乎是繪製函數。 5000弧似乎需要一段時間才能畫出。我會嘗試繪製5000個矩形。如果速度快得多,可能仍然值得使用合成材料繪製圓形透明png來爲其着色。計算弧的輪廓將會很慢,我想可能不是硬件加速。另一方面,圖像混合/縮放/着色可以。以下是時間安排:https://developer.mozilla.org/en-US/docs/Web/API/Performance/now – enhzflep