スキップしてメイン コンテンツに移動

[JavaScript]フリーズしないループとフレームレートの導入を実現するお手軽コード

PixelArtsという個人的なプロジェクトでcanvasをガンガン使っているんですが、canvasとその周辺技術についてTipsをまとめたいと思います。まず最初のTipsはループ処理。ゲームなどでキー入力待ちを行う場合などは、ループ処理で入力を待つなんて事をしますが、JavaScriptでループを回しっぱなしにするとフリーズします。フリーズせずにループをする方法に加えて、擬似的にフレームレートを設定する方法をまとめます。




ループ処理

私はループして図形を動かし続けるために、forやwhileを使わずsetTimeout()を使った割り込み可能なループをよく使います。
ページに留まり続ける限りループさせ続けるのが前提なので、forやwhileだとフリーズしたようになります(forefoxやchromeではスクリプトが長く動いていると警告が出ます)。
JavaScriptにはsleepがないので、setTimeout()でインターバルを設ける事で、擬似的にsleep処理を行っている雰囲気です。
var fps = 20, interval = 1000 / fps;

function play(){
    var sTime = new Date().getTime();
    /*
      なんらかの処理
    */
    var eTime = new Date().getTime();
    var intervalTime = interval - (eTime - sTime);

    if (intervalTime < 0) intervalTime = 0;
    if (runFlg){
        time = setTimeout(arguments.callee, intervalTime);
    }
};

上記のソースは、PixelArtsで作品を作る際の雛形からループ処理に関する部分だけを抜粋したものです。
変数fpsで、1秒間にループさせる回数を設定して、変数intervalで1ループ辺りのミリ秒を取得します。
play()の先頭で実行開始時間をsTimeに格納し、終了時間をeTimeに格納します。
後はeTime-sTimeとintervalを比較して次のplay()を実行するタイミングを取得しています。

HTMLにbuttonが配置されていて、それを押すとrunFlgがtrue/falseが切り替わるようになっています。
これで一時停止を実現しています。

play()の中でforやwhileを利用することはありますが、arrayを走査するなど、短時間で終わる事が分かっているものなので、ブラウザの操作に支障が出るレベルではありません。


フレームレートの設定

先のソースコードにもまんまfpsと書いていますが、これが設定値ですね。intervalは1フレーム当たりに割り当てられた時間になる訳ですが、ループ内のコードを実行するのにかかった時間を加味して次回実行するまでの時間をintervalTimeに計算しています。


今回紹介したコードはPixelArtsのどのコードにも登場する定番コードです。
PixelArtsはMath.random()を使ってプログラマーが芸術に挑戦するというものです。
PixelArtsの方もよろしくお願いします。

PixelArts


コメント

このブログの人気の投稿

[VB.NET]オレオレ証明書でSSL通信するための短絡的な解決法

VB.NETソフトウェアでサーバーと通信することはよくある事だと思いますが、最近はHTTPを使って明けっ広げに刺しに行くよりHTTPSを使って暗号化してこそこそやった方が時代の流れに即した感じですよね(違うか)。 いちいちテスト環境でSSL証明書を用意するのも面倒だということで、セキュリティ的には全くよろしくない方法で迂回できるので紹介します。

[JS]Canvasでよく使う描画テクまとめ

HTMLで画像をいじくりたい時は、canvasを利用して編集するのは一般的ですが、WindowsストアアプリではHTML+CSS+JSでのアプリ開発ができる事もあって、簡単な画像編集であれば、C#やVBを使うより分かりやすいし資料が多く、C++でDirectXをガリガリ書くよりお手軽。入出力もファイルピッカーを使えば簡単に実装できます。今回は、Windowsのコードではなく、Canvasを利用する時のJavaScriptを使いどきに合わせてまとめていきます。

curl の基本的な使い方 -設定編-

今回のcurl TIPSは、curlをより日常的に使っていくためのHow toです。curlには、数多くのオプションが用意されていて、それらを組み合わせる事で様々な事が楽になるでしょう。サービス監視の自動化などにはまさにcurlの得意分野です。 今回は、curlを更に自分のものにしていくために大事なカスタマイズの部分を解説します。