LoginSignup
1
1

More than 1 year has passed since last update.

ループに関する考察

Last updated at Posted at 2021-12-19

Scratchのループ(くりかえす)について、考察してみました。

通常のループ

まずはシンプルにループしている間、変数の値を足し続けるループを作ってみます。

結果は次の通りです。

image.png

約900万までカウントされました。この数字はScratchの全力のループ回数と予想されます。マシンスペックによって変わると思います。

通常のループ×2

次にシンプルなループを二つ用意します。新たに追加したループは、最初のループの半分の時間で終わるようにしておきます。

結果は次の通りです。

image.png

一つ目のカウントは二つ目のカウントの2倍強となっています。また二つのカウントを足すと、最初のループの時のカウントとほぼ同じ約900万となります。そのため、ループが複数あると、Scratchの全力がそれぞれのループに按分されると予想されます。

画面描画処理を含むループ

次に画面描画処理を含むループを追加します。この処理も最初のループの半分の時間で終わるようにしておきます。

結果は次の通りです。

image.png

描画ありカウントは、約150となっています。これはScratchが画面描画を1秒間に30回行うという仕様に基づいていそうです。描画ありカウントは5秒間行っているので、30*5=150ということです。描画なしカウントは約450万ですが、これは最初のループの時の900万の約半分です。つまり前半5秒間は画面描画処理を含むループにつれられて1秒間に30回というブレーキがかかっていましたが、後半5秒間は全力でループを回せていたということになりそうです。

再描画をしないブロック内のループ

最後に、再描画をしないブロック内のループを追加します。

image.png

これも半分の時間で終わるようにしておきます。

結果は次の通りです。

image.png

描画なしのカウントは約450万と、全力でカウントできたのは再描画をしないブロックのループが終わってからになっています。また再描画なしのブロックのループは約670万回となっていて、通常のループよりも150%速くなっています。これは、実は最初のループはScratchの全力のうち、画面描画にもそれなりのパワーが取られていたことを意味していそうです。実際、再描画なしのブロックのループが回っているときは、画面描画は1秒に2回ほどのカクカクになってしまいました。

結果

今回の実験では、次のことがわかりました。

  • 通常のループでは、画面描画に影響がない範囲で全力でループが回る。
  • 複数のループがあると、Scratchの全力がそれぞれに分けられる。
  • 画面描画を含むループが実行された場合、すべてのループが1秒間に30回のスピードで回る。
  • 再描画をしないブロックのループが実行された場合、画面描画に影響が出るほど全力でループが回る。

考察

一般的なプログラム言語では、全力の無限ループを作成すると、CPUリソースを全力で消費してしまいます。その結果CPU使用率が100%になったり、画面が固まったりするので、良くないことだと言われています。そして、ループの中にウェイトを入れるなどして、他の処理にもCPUリソースを使わせるような実装をすることが必要です。
しかしScratchでは、複数の無限ループを作成しても、CPUリソースは公平に割り当てられます。そして、ループにウェイトを入れなくても、画面が固まったりすることはありません。
ただし、再描画をしないブロックのループについては、上記が当てはまらず画面が固まります。そのため「再描画をしないブロック」と「ループ」の組み合わせをするときには注意をしたほうが良さそうです。

サンプルプロジェクト
https://scratch.mit.edu/projects/618585447

1
1
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
1
1