やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

JSでゲームループを作る前にAPI調査

setInteval、requestAnimationFrameの二種類ある。

問題

キーを長押し入力するとき、リピート遅延や間隔の時間がOS設定値になってしまう。指定した値にしたい。

解法

ゲームループを実装してFPS管理する。

(一定期間ごとに処理するループを作る。大抵は1/60秒毎。JSは遅いので1/30秒程かも)

2つのイベントAPI

イベント 説明
setInteval 一定間隔で実行する。1/60秒だとCPU使用率が高まり高負荷になる
requestAnimationFrame ブラウザの描画更新単位と同じ単位で呼び出される(1/60秒)。非アクティブ時はFPS低下。

メモリリーク

イベントは解除しないとメモリリークする。

それぞれに対応するイベント解除用APIを含めて以下に示す。

setInteval

API 説明
setInteval 一定の遅延間隔を置いて関数を繰り返し呼び出す
clearInterval setIntevalを解除する

ちなみに、一回限りの実行なら以下の関数が使える。

API|説明 ---|---- setTimeout |指定された遅延の後に関数を実行する clearTimeout|setTimeoutを解除する

requestAnimationFrame

API 説明
requestAnimationFrame アニメーション処理の開始を要求する
cancelAnimationFrame アニメーション処理の開始をキャンセルする

unload

ブラウザのタブを消すべく✘ボタンをクリックしたら発火。これでイベント解除処理を実行すればいいのかな? ブラウザ内部でやってくれそうな気がするけど。

API 説明
unload ユーザーがページから離れる際に発火する
onbeforeunload unloadの直前に発火する
window.addEventListener("unload", function() {
    cancelAnimationFrame(rid);
    clearTimeout(oid);
    clearInterval(iid);
}, false);

デストラクタがない

JSはデストラクタがない。新しい仕様だとclassはある。コンストラクタもある。でもデストラクタがない。

class MyClass {
    constractor () {
        this.name = "nanasi";
    }
}
let c = new MyClass();
c = null;

たしかc = null;のようにインスタンス変数にnullをセットすれば、いずれGCが回収してくれる仕様だったと思う。

参考