setTimeoutメソッドを利用すると、「指定した間隔」と「ブラウザが画面を更新するタイミング」に差が生じることになります。そうなると、ブラウザが一度画面を更新する間に、何度か描画処理を行ってしまう事態が起き、
パフォーマンスの低下につながる恐れがあります。それを解決するのが、requestAnimationFrameメソッドです。
<中略>
長所…毎回、ちゃんと描画できるタイミングで実行されるようになるため、「DOMやCSSを書き換えたが、描画できないタイミングだったので実際には動いていない」という無駄な処理が発生しない。
setintervalメソッドと同様に、ブラウザ上でタブが非アクティブな状態になると、処理が軽減される。
短所…処理が実行さえっるタイミングでブラウザの画面更新のタイミングに依存するため、狙ったときに実行できない。また、実行されるタイミングも必ずしも一定とは限らないため、決まった間隔で処理させたい場合には、setTimeoutメソッドやsetintervalを使用するといい。
ブレイクスルーjavascript70頁~71頁より
ここで質問がありなす。
①setTimeoutメソッドを利用すると、「指定した間隔」と「ブラウザが画面を更新するタイミング」に差が生じるとはどういうことなのでしょうか。更新すると何度が描画処理を行ってしまうとありますが、いまいち理解できません。
②
var canvas = document.getElementById("canvas"); //canvas要素から描画コンテキストの取得 var ctx = canvas.getContext("2d"); //16.6ミリ秒(0.01666...秒) var interval = Math.floor(1000/60); var x=5; var y=5; function draw() { ctx.clearRect(0,0,500,500); x+=5; y+=5; //パスを初期化。ここでいうパスとは、領域の境界線のようなものだという。 ctx.beginPath(); //塗りつぶす色を指定。 ctx.fillstyle = "#99ff66";//緑色 //長方形のパスを作成。第一引数がx座標(横)、第二引数がy座標(縦)、第三引数が横幅、第四引数が高さだ。座標というのは、ブラウザの表示領域のX軸とY軸のことだ。0,0にすれば、ブラウザの左上に表示される。 ctx.rect(x,y,100,200);//rectは、rectangel(長方形、矩形)の略である。 //円形のパスを作成。 //ctx.arc(100,100,40,0,Math.PI*2);//第一引数と第二引数が座標(横縦)、第三引数が半径、第四が円の始まりの角度、第五が円の終わりの角度、第六が描く向き //fillで長方形を塗りつぶす。何も指定しないと黒色となる。 ctx.fill();//fillは、容器や場所などをいっぱいにする、満たすという意味だ。 //最後にbeginPathで開始したパスを閉じる。 ctx.closePath(); setTimeout(draw,interval); } draw();
上記がrequestAnimationFrameメソッド無しで、下記がrequestAnimationFrameメソッドありのソースです。同書籍の71頁に
<中略>ブラウザを開いて、動いていることを確認しましょう。先ほどと同じ動作となっていれば大丈夫です。
とありましたが、requestAnimationFrameありだと図形の描画の速さが無しに比べて早く、タスクマネージャーを開いてみてみると無しに比べ負担が増えたように見えます。これは、先ほどと同じ動作とは違うという認識であっておりますか。またどうすると先ほどと同じ動作になるのでしょうか。
var canvas = document.getElementById("canvas"); //canvas要素から描画コンテキストの取得 var ctx = canvas.getContext("2d"); //16.6ミリ秒(0.01666...秒) var interval = Math.floor(1000/60); //よくわからないが、settimeoutで指定した間隔とブラウザが画面を更新する時機に差が生じ、それによって不都合なことがおきるのを防ぐのがrequestAnimationFrameという。 //しかし"ブラウザが画面を更新する時機"というのがどういうことなのかさっぱり理解できない。 window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || function(cb) {setTimeout(cb,17);}; var x=5; var y=5; function draw() { ctx.clearRect(0,0,500,500); x+=5; y+=5; //パスを初期化。ここでいうパスとは、領域の境界線のようなものだという。 ctx.beginPath(); //塗りつぶす色を指定。 ctx.fillstyle = "#99ff66";//緑色 //長方形のパスを作成。第一引数がx座標(横)、第二引数がy座標(縦)、第三引数が横幅、第四引数が高さだ。座標というのは、ブラウザの表示領域のX軸とY軸のことだ。0,0にすれば、ブラウザの左上に表示される。 ctx.rect(x,y,100,200);//rectは、rectangel(長方形、矩形)の略である。 //円形のパスを作成。 //ctx.arc(100,100,40,0,Math.PI*2);//第一引数と第二引数が座標(横縦)、第三引数が半径、第四が円の始まりの角度、第五が円の終わりの角度、第六が描く向き //fillで長方形を塗りつぶす。何も指定しないと黒色となる。 ctx.fill();//fillは、容器や場所などをいっぱいにする、満たすという意味だ。 //最後にbeginPathで開始したパスを閉じる。 ctx.closePath(); requestAnimationFrame(draw); setTimeout(draw,interval); } draw();
ブラウザがchrome61.0.3163.100でosがwindows10での環境での疑問です。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/13 11:16 編集
2017/11/14 10:18
2017/11/14 10:37
2017/11/15 10:20 編集
2017/11/15 10:55
2017/11/20 10:25
2017/11/20 11:23
2017/11/21 10:32