我正在做的一个实验有问题。
我的计划是在整个页面上都有一个美丽而闪亮的星星背景。使用那个精彩的教程(http://timothypoon.com/blog/2011/01/19/html5-canvas-particle-animation/)我设法获得了完美的背景。我使用静态画布显示静态星星,使用动画画布显示闪亮星星。
事实是它非常消耗内存!在 chrome 和 opera 上它运行得非常顺利,但在 Firefox IE 或平板电脑上,渲染每一帧等都是一团糟……在 HEIGHT 很大的页面上更糟。
所以我进行了一些优化:
- 使用缓冲画布,问题是每帧调用 1500 次的 createRadialGradient
- 使用一个大的缓冲画布,每个星星 1 个画布,在初始化时只调用 createRadialGradient。
- 删除缓冲画布并将每个星星画布绘制到主画布
最后的优化是我能做到的最好的,所以我写了一个小提琴来展示代码现在的情况。
//Buffering the star image
this.scanvas = document.createElement('canvas');
this.scanvas.width=2*this.r;
this.scanvas.height=2*this.r;
this.scon=this.scanvas.getContext('2d');
g = this.scon.createRadialGradient(this.r,this.r,0,this.r,this.r,this.r);
g.addColorStop(0.0, 'rgba(255,255,255,0.9)');
g.addColorStop(this.stop, 'rgba('+this.color.r+','+this.color.g+','+this.color.b+','+this.stop+')');
g.addColorStop(1.0, 'rgba('+this.color.r+','+this.color.g+','+this.color.b+',0)');
this.scon.fillStyle = g;
this.scon.fillRect(0,0,2*this.r,2*this.r);
这就是我需要你的地方:
- 一种根据用户表现调整闪亮星星数量的方法
- 优化提示
在此先感谢所有愿意帮助我的人,如果我犯了语法错误,我深表歉意,我的英语并不完美。
编辑 感谢您的反馈,让我解释整个过程,每颗星星都有自己不同的渐变和大小,这就是为什么我将它存储到个人画布中,闪亮的效果只能通过使用 drawImage 在主画布上缩放该画布来完成。
我认为最好的办法是在缓冲画布中预渲染 50 或 100 颗不同的星星,然后随机挑选并绘制一颗,你不觉得吗?
编辑2
根据术士的建议更新了小提琴,一颗预渲染的星星,缩放以匹配当前大小。星星不那么漂亮,但整个事情运行得更顺畅。
编辑3
更新小提琴以使用精灵表。华丽的!!!!
//generate the star strip
var len=(ttlm/rint)|0;
scanvas = document.createElement('canvas');
scanvas.width=len*2*r;
scanvas.height=2*r;
scon=scanvas.getContext('2d');
for(var i=0;i<len;i++){
var newo = (i/len);
var cr = r*newo;
g = scon.createRadialGradient(2*r*i+r,r,0,2*r*i+r,r,(cr <= 2 ? 2 : cr));
g.addColorStop(0.0, 'rgba(200,220,255,'+newo+')');
g.addColorStop(0.2, 'rgba(200,220,255,'+(newo*.7)+')');
g.addColorStop(0.4, 'rgba(150,170,205,'+(newo*.2)+')');
g.addColorStop(0.7, 'rgba(150,170,205,0)');
scon.fillStyle = g;
scon.fillRect(2*r*i,0,2*r,2*r);
}
编辑 4(最终)
动态明星创作
function draw() {
frameTime.push(Date.now());
con.clearRect(0,0,WIDTH,HEIGHT);
for(var i = 0, len = pxs.length; i < len; i++) {
pxs[i].fade();
pxs[i].draw();
}
requestAnimationFrame(draw);
if(allowMore === true && frameTime.length == monitoredFrame)
{
if(getAvgTime()<threshold && pxs.length<totalStars )
{
addStars();
}
else
{
allowMore=false;
static=true;
fillpxs(totalStars-pxs.length,pxss);
drawstatic();
static=false;
}
}
}
这是更新的和最终的小提琴,带有精灵表、动态星星创建和一些优化。如果您看到其他我应该更新的内容,请不要犹豫。
POST EDIT重新启用流星/原型对象/摆脱 Jquery
http://jsfiddle.net/macintox/K8YTu/32/
感谢所有帮助过我的人,这真的很友善和有启发性,我希望它有时会对某些人有所帮助。
埃斯多特。PS:我很高兴。经过测试,该脚本在每个浏览器甚至 IE9 上都能流畅运行。亚塔!!