0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【javascript】高負荷な計算中にアニメーションを更新する

Posted at

以前JavaScriptでリバーシを作ったことがあるのですが、そのとき実装に手間取ったことがあるのでメモしておきます。

リバーシAIが8手読みやら10手読みを実行すると、JavaScriptではどうしても10秒前後時間がかかってしまいます。その間に現在AIがどのマスについて先読みしているのかを表示させようとしました。

うまくいく実装

for(const node of childnodes){
    //数秒かかる重たい処理
    const evaluation = node.calcEvalucation();

    //評価値を計算し終えたマスに色を付ける
    document.getElementByID(node.id).style.background = "#00ff00";

    //アニメーションを実行
    await new Promise(resolve=>{
        setTimeout(()=>{}, 0);
    });
}

解説

3段目の「アニメーションを実行」の部分がみそです。

//アニメーションを実行
await new Promise(resolve=>{
    setTimeout(()=>{}, 0);
});

setTimeoutで空の関数を並行処理させると、その間にDOMのアニメーションが実行されるようです。
もちろんawait構文を使っているので、外側の関数がasyncでなければなりません。

うまくいかない実装

念のため、うまく行かない実装も載せておきます。

for(const node of childnodes){
    //数秒かかる重たい処理
    const evaluation = node.calcEvalucation();

    //評価値を計算し終えたマスに色を付ける
    document.getElementByID(node.id).style.background = "#00ff00";
}

そのまま実装すると、アニメーションが更新される前に別のマスについて先読みが開始してしまいます。これではAIがどのマスについて思考中なのかわかりません。アニメーションが更新されるのは全体の処理が実行し終わってからになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?