2011-12-23 23 views
1

2次元グリッドを移動する補強エージェントを視覚化しようとしています。私はキャンバスを使用して視覚化をコーディングし、エージェントが移動するたびにグリッドを更新しようとします。私はアニメーションを見たいと思っていましたが、代わりにエージェントがこのすべての動作を完了して最終状態を見るまで何も見ません。 Google Chromesデベロッパーツールを使用すると、個別の手順を確認できます。私のコードが速く走っているのは問題ではないと思う。各ステップには数秒かかります。キャンバス要素が更新されない

私の実装は次のとおりです。gridWorld()は新しいオブジェクトを作成するために一度呼び出され、描画するたびに呼び出されるのはexecuteActionです。示されているように私はctx.save()ctx.restore()を使用しましたが、これはこの問題を解決するための試みにすぎず、違いはありませんでした。コードの実行に時間がかかる場合であっても、コードの実際のブレークがあるまで

おかげ

var execute gridWorld = function(action) { 
    var canvas = document.getElementById("grid"); 
    this.ctx = canvas.getContext("2d"); 

    this.executeAction = function(action) { 
     this.ctx.save() 
     // ... Do reinforcement learning stuff 
     // For every cell in grid, do: 
     this.ctx.fillStyle = "rgb(244,0,0)" 
     this.ctx.fillRect(positionX, poisitonY, 10,10) 

     this.ctx.restore(); 
    } 
} 

答えて

0

は、ブラウザの表示を更新しません。 setTimeout()を使用すると、キャンバスを更新するたびにコード実行が中断されます。

+0

ありがとうございますが、私はこれをどのように処理するかについては不明です。私の実行アクション関数では、描画コードをsetTimeout(draw、15)に置き換えました。しかしdraw関数は15ミリ秒後に呼び出されないように思われますが、メインコードの実行が終了した後に呼び出されます(前と同じ問題)。また、描画コードはエージェントの状態に依存しますが、順序外に呼び出された場合、どのようにこの状態になるのかを確認するにはどうすればよいですか? – zenna

+0

'[最初のフレームを描画するコードを実行する] [待機] [2番目のフレームを描画するコードを実行する] [wait]' etc ...前のフレームは次のフレームを描画する関数で 'setTimeout'を使う必要があります。コードがフレーム単位で設定されていない場合は、変更する必要があります。 –

1

あなたはあまりにも速く起こっているので、アニメーションが見えません。あなたは次の例のようにそれらを分割する必要があります。

Live Demo

私は例

for(x = 0; x < 256; x++){ 
    player.x = x; 
    ctx.fillStyle = "#000"; 
    ctx.fillRect(0,0,256,256); 
    ctx.fillStyle = "#fff"; 
    ctx.fillRect(player.x,player.y,4,4); 
} 

のために、このような何かをした場合にのみ、これまでボードの最後にその関数が呼び出されるたびに選手を見るであろう、そしてあなたは「wouldnループが速すぎるため、その間のアニメーションが表示されません。それで私のライブデモでは少しずつ増やし、15ミリ秒ごとに描画を呼び出すので、実際に何がキャンバスに置かれているのかを実際に確認する機会があります。

+0

ありがとう、しかし私は私の質問で言ったように、私のコードは高速であるとは思わない(それらはすべてのループで起こっている重要な計算なので)。代わりに、私はメインループがどうにかして画面の更新をブロックしていると思う。私は上記の答えに私のコメントに記載されているように、この成功を回避するためにsetTimeoutを使用しようとしました。 – zenna

+0

@zenna誰かがコードや例をもっと見なければならないように助けてもらうために。しかし、あなたがループ内で知っていることは、あなたがそれを壊さない限り、キャンバスへの更新を見ることは決してありません.forループでは、forループfyi内で起こる更新を決して見ることはありません。 – Loktar

関連する問題