2016-03-20 1 views
1

JSでコードを書いたので、ユーザーは画面をクリックして四角形を作成し、四角形のサイズを大きくしてからスタンプすることができます。問題は、マウスが最初にクリックされた位置から移動すると、マウスが押し下げられている間に正方形のサイズが増加する速度が遅くなることです。私は間隔を使って1ミリ秒の時間をかけてサイズを変更しています。以下はJSコード(Jqueryを使用)です:

更新:コードスニペットを実行すると、問題は表示されません。ファイルとして保存して実行すると、おそらく問題が発生します。マウスの動きがJavascriptの間隔に影響するのはなぜですか?

<!DOCTYPE html> 
 

 
<html> 
 

 
<head> 
 
\t <title>My Canvas</title> 
 

 
\t <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> 
 

 
\t <script type="text/javascript"> 
 
\t $(function() { 
 

 
\t \t var mouseDown 
 
\t \t var c = document.getElementById('myCanvas'); 
 
\t \t var ctx = c.getContext("2d"); 
 
\t \t var objects = [] 
 

 
\t \t c.addEventListener("mousedown", onMouseDown); 
 
\t \t c.addEventListener("mouseup", onMouseUp); 
 

 
\t \t function createSquare(x, y, size) { 
 
\t \t \t this.x = x; 
 
\t \t \t this.y = y; 
 
\t \t \t this.size = size; 
 
\t \t \t this.draw = draw; 
 
\t \t \t this.drawStylus = drawStylus; 
 
\t \t \t this.clear = clear; 
 
\t \t }; 
 

 
\t \t function draw() { 
 
\t \t \t ctx.fillRect(this.x, this.y, this.size, this.size); 
 
\t \t }; 
 

 
\t \t function drawStylus() { 
 
\t \t \t ctx.fillRect(this.x, this.y, this.size, this.size); 
 
\t \t }; 
 

 
\t \t function clear() { 
 
\t \t \t ctx.clearRect(this.x, this.y, this.size, this.size); 
 
\t \t } 
 

 
\t // \t var mySquare = new createSquare(100,100,100); 
 
\t // \t mySquare.draw(); 
 

 
\t \t function onMouseDown() { 
 
\t \t \t mouseDown = true 
 
\t \t \t x = event.clientX 
 
\t \t \t y = event.clientY 
 
\t \t \t size = 100 
 
\t \t \t console.log('clicked') 
 

 
\t \t \t interval = setInterval(function() { 
 
\t \t \t \t size = size + 5 
 
\t \t \t \t var cursorSquare = new createSquare(x,y,size); 
 
\t \t \t \t cursorSquare.clear(); 
 
\t \t \t \t cursorSquare.drawStylus(); 
 
\t \t \t }, 1); 
 
\t \t }; 
 

 
\t function onMouseUp() { 
 
\t \t console.log('up') 
 
\t \t if (mouseDown) { 
 
\t \t  clearInterval(interval); 
 
\t \t  var newSquare = new createSquare(x,y,size); 
 
\t \t  newSquare.draw(); 
 
\t \t  mouseDown = false 
 
\t \t \t }; 
 
\t }; 
 
\t }); 
 
\t </script> 
 

 
</head> 
 

 
<body> 
 

 
<canvas id='myCanvas' width="5000" height="5000" style="border:1px solid #000000;"> 
 
\t 
 
</canvas> 
 

 
</body> 
 

 
</html>

+1

私はコードスニペットを実行すると私はあなたの話すのが遅くなるのを見ていない – Observer

+0

それはそれが私のPCから直接開いたファイルである場合にのみ表示されます。そのスニペットをHTMLファイルに貼り付ける場合は、Chromeで開き、問題が発生する可能性があります。 –

+0

Chromeを使用してコンテンツに貼り付けられたファイルからも表示されません。 –

答えて

1

問題は間隔、

ファーストです。 1ミリ秒はレンダリングには短すぎるため、マウスは1/60秒程度で更新され、1/60(短期間)以上にレンダリングするとブラウザに負荷がかかり、画面の更新もレンダリングの1/60秒でレンダリングが失われ、ディスプレイに表示される可能性もあります。

第2に、一部のブラウザでは1ミリ秒が短すぎます(各ブラウザの最小間隔時間を忘れてしまいます)。問題は、インターバル期間よりも長いタスクを表示すると、コールスタックへのコール、効果的に他のイベントやブラウザのアップキープを遅延させます。このような状況でsetIntervalを引き続き使用すると、コールスタックのオーバーフローが発生し、ページ上のすべてのJavaScriptがクラッシュします。

何らかの理由で単純なルールではsetIntervalを使用しないでください。コールスタックオーバーフローから保護し、制御されていないコールがコールスタックに置かれるのを防ぐので、代わりにsetTimeoutを使用してください。 setTimeoutを使用すると、実際にはより良い時間間隔が得られます。あなたが必要な間隔にできるだけ近い滞在する次の呼び出し、のsetIntervalは行うことは非常に困難になり、何かのタイムアウトを調整することができますnew Date().valueOf()を経由して時間を取得することにより、

// simple timeout 
var interval = 50 
function myTimer(){ 
    setTimeout(myTimer,interval); // set up the next interval 
} 
// start it 
setTimeout(myTimer,interval); 

。呼び出しを停止するには、停止フラグが設定されている場合はsetTimeoutを呼び出さないでください。

​​はグラフィックの場合はsetTimeoutと非常によく似ていますが、タイムアウトは指定しないでください。ブラウザはレンダリングエンジンとレイアウトエンジンの同期に最適な時間を得られますディスプレイのハードウェアは、ちらつきや剪断を受けることはありません。マウスとの調整のために

function update(time){ // requestAnimationFrame calls the function with the time in milliseconds 
    // do what is needed 
    requestAnimationFrame(update); // get next frame when browser is ready 1/60th second 
} 
requestAnimationFrame(update); // start it going 

ちょうどあなたのマウスリスナーがmouseXmouseYbuttonStateのようないくつかの変数を設定し、より多くの何もしない持っています。 update関数では、これらの値を使用してマウスを処理します。これにより、はるかに管理しやすいマウスインターフェイスが作成されます。

+0

Blindman67さん、ありがとうございました。しかし、アニメーションフレームに関連して別の問題が発生しました。http://stackoverflow.com/questions/36115240/why-does-this-script-lag-delay-in-javascript –

関連する問題