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が回収してくれる仕様だったと思う。