Scratch projects and the loops within them normally run at 30 frames per second but this is not always true. This project is to explore and demonstrate this. Set all the sliders on to 0 and you will see the counter loop runs very fast (much faster than 30 times per second). Every loop in Scratch has an implicit yield. The script will stop executing and Scratch will run any other scripts waiting to run before returning to the loop. If nothing on the screen changes Scratch will continue running scripts as fast as possible. Now set slider move 1: 1. Sprite1 turns 1 degree per frame and the counter runs at 30 counts per second. If any of the scripts cause something to change on the screen Scratch will wait until after the next screen refresh before continuing. In general most projects do update the screen every frame and the project runs at 30 counts per second as if by magic. It is also possible to force Scratch to yield and wait until the next screen refresh. An explicit yield can be triggered using a wait (0) seconds block. Now set move 1: 0 and wait 1: 1 Once again we see the counter running at 30 counts per second. Looks good, but is it? Now set wait 1: 1 and move 2: 1 The counter is running at 15 counts per second. Something is wrong, so what is happening here? In the Sprite1 we create an explicit yield by calling wait 0 seconds. Scratch then moves onto Sprite2. Sprite2 changes the screen by turning 1 degree. Sprite2 reaches the implicit yield point at the end of the loop and waits for the screen refresh. After the screen refresh Scratch comes back to Sprite1, now Sprite1 hits the implicit yield at the end of the forever loop. Scratch switches to Sprite2. Sprite2 again changes the screen by turning 1 degree. Now both scripts again wait for the screen refresh. Sprite1 has to yield twice per frame. Next set wait 1: 0 and wait 2: 1 Now we have 60 counts per second, but Scratch runs at 30 frames per second. How is this possible? Sprite2 explicitly yields by calling wait 0 seconds, this allows Sprite1 to change counter by 1 and Scratch waits for the screen refresh. Next Sprite2 reaches the implicit yield at the end of the forever loop. Nothing has changed on the screen, Scratch does not wait for a screen refresh and Sprite 1 can immediately change counter by 1. This allows Sprite1 to update the counter twice in one frame. Next set move 2: 0, wait 2: 0 Set invalidate screen: 1 Conclusion: Don't trigger explicit yields using wait 0 seconds inside loops. This can have unintended consequences. The Invalidate Screen sprite in this project forces normal loops to run 30 times per second. This does not affect custom blocks that use run without screen refresh. Turbo mode by definition overrides this. Consider Chuckie Egg: Hen house Harry moves based on keyboard input. Hens move every 9 frames. The big bird moves every second frame. Therefore there are some frames where no screen update occurs. In fact the reason this project works correctly is because the text engine repaints the score each frame, but this is not necessary. It is luck not design that this project works correctly.
This is an advanced topic only affecting the most advanced projects. It is difficult to understand so feel free to remix with your own explanation if you can. Or comment below if you think something should be explained better. Be sure to check out @TheLogFather's helpful post on this subject https://scratch.mit.edu/discuss/topic/313368/?page=1#post-3230965