取り組んでいる実験に問題があります。
私の計画は、美しく輝く星の背景をページ全体に配置することです。その素晴らしいチュートリアル ( http://timothypoon.com/blog/2011/01/19/html5-canvas-particle-animation/ ) を使用して、完璧な背景を取得することができました。静的キャンバスを使用して静的な星を表示し、アニメーション キャンバスを使用して輝くものを表示します。
実際には、非常にメモリを消費しています。chrome と Opera では非常にスムーズに動作しますが、firefox IE やタブレットでは、各フレームをレンダリングするのに 1 秒もかかりませんでした... HEIGHT が巨大なページではさらに悪化します。
だから私はいくつかの最適化に入りました:
- バッファ キャンバスを使用すると、フレームごとに 1500 回呼び出される createRadialGradient が問題でした
- 大きなバッファ キャンバスと、星ごとに 1 つのキャンバスを使用し、init で 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 個の異なる星を事前にレンダリングしてから、ランダムな星を選んで描画するのが最善だと思いませんか?
EDIT2
ウォーロックの偉大なアドバイスに従って更新されたフィドル、現在のサイズに合わせてスケーリングされた 1 つの事前レンダリングされた星。星はきれいではありませんが、全体がよりスムーズに動作します。
EDIT3
スプライト シートを使用するようにフィドルを更新しました。素敵!!!!
//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;
}
}
}
これは、スプライトシート、動的な星の作成、およびいくつかの最適化を備えた、更新された最終的なフィドルです。他に何か見たら、ためらわずに更新する必要があります。
編集後 流れ星を再度有効にする/オブジェクトのプロトタイプを作成する/Jquery を削除する
http://jsfiddle.net/macintox/K8YTu/32/
私を助けてくれたすべての人に感謝します。それは本当に親切で有益でした。
Aesdotjs。PS: とても嬉しいです。テスト後、そのスクリプトは IE9 を含むすべてのブラウザーでスムーズに実行されます。やった!!