[解決済み] requestAnimationFrameでfpsを制御する?
2022-05-07 17:32:49
質問
と思われます。
requestAnimationFrame
は、今やアニメーションのデファクトである。しかし、今、私はキャンバスのアニメーションをしようとしていて、疑問に思っていました。ある一定のfpsで動作するようにする方法はないのでしょうか?rAFの目的は一貫して滑らかなアニメーションであることは理解していますし、私のアニメーションが途切れ途切れになる危険性もありますが、今はかなり任意に極端に異なる速度で動作しているようです。
私なら
setInterval
しかし、私はrAFが提供する最適化(特にタブにフォーカスが当たったときに自動的に停止する)が欲しいのです。
私のコードを見たい人がいるかもしれないので、一応書いておきます。
animateFlash: function() {
ctx_fg.clearRect(0,0,canvasWidth,canvasHeight);
ctx_fg.fillStyle = 'rgba(177,39,116,1)';
ctx_fg.strokeStyle = 'none';
ctx_fg.beginPath();
for(var i in nodes) {
nodes[i].drawFlash();
}
ctx_fg.fill();
ctx_fg.closePath();
var instance = this;
var rafID = requestAnimationFrame(function(){
instance.animateFlash();
})
var unfinishedNodes = nodes.filter(function(elem){
return elem.timer < timerMax;
});
if(unfinishedNodes.length === 0) {
console.log("done");
cancelAnimationFrame(rafID);
instance.animate();
}
}
Node.drawFlash()は、カウンタ変数に基づいて半径を決定し、円を描画するいくつかのコードにすぎません。
解決方法は?
requestAnimationFrame を特定のフレームレートにスロットルする方法
5 FPSでのスロットリングのデモ。 http://jsfiddle.net/m1erickson/CtsY3/
このメソッドは、最後のフレームループを実行してからの経過時間をテストすることで動作します。
描画コードは、指定したFPSの間隔が経過したときにのみ実行されます。
コードの最初の部分では、経過時間の計算に使用するいくつかの変数を設定します。
var stop = false;
var frameCount = 0;
var $results = $("#results");
var fps, fpsInterval, startTime, now, then, elapsed;
// initialize the timer variables and start the animation
function startAnimating(fps) {
fpsInterval = 1000 / fps;
then = Date.now();
startTime = then;
animate();
}
そして、このコードが実際のrequestAnimationFrameループで、指定したFPSで描画を行います。
// the animation loop calculates time elapsed since the last loop
// and only draws if your specified fps interval is achieved
function animate() {
// request another frame
requestAnimationFrame(animate);
// calc elapsed time since last loop
now = Date.now();
elapsed = now - then;
// if enough time has elapsed, draw the next frame
if (elapsed > fpsInterval) {
// Get ready for next frame by setting then=now, but also adjust for your
// specified fpsInterval not being a multiple of RAF's interval (16.7ms)
then = now - (elapsed % fpsInterval);
// Put your drawing code here
}
}
関連
-
HTML5 LocalStorage ローカルストレージとセッションストレージの使用法
-
[解決済み] jQueryでチェックボックスに "checked "を設定する
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] jQueryでページを更新するにはどうすればよいですか?
-
[解決済み] jQueryで要素にスクロールする
-
[解決済み] jQueryで入力を無効化/有効化する?
-
[解決済み] JavaScriptで2つの日付を比較する
-
[解決済み] jQueryで現在のURLを取得する?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
jQueryのコピーオブジェクトの説明
-
vueディレクティブv-bindの使用と注意点
-
vue ディレクティブ v-html と v-text
-
[解決済み】TypeErrorの解決方法。未定義またはヌルをオブジェクトに変換できない
-
[解決済み】ExpressJS - throw er Unhandled errorイベント
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
[解決済み】<select>で現在選択されている<option>をJavaScriptで取得するにはどうすればよいですか?
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。
-
モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'D:\.... \node_modules