The hundred millisecond flash law
Built on Bloch's law, 1885 by A. A. Bloch. Sources for this reference
A one frame flash and a three frame flash are not the same effect at different lengths. Below roughly 100 milliseconds the visual system integrates energy rather than tracking instantaneous brightness, so duration and intensity trade against each other directly. That is Bloch's law, and it decides whether a punch lands or is simply missed.
It starts paused, and nothing moves until you press play. One cycle every 2.4 seconds is 0.42 Hz, well below the 3 Hz floor of the 3 to 30 Hz band associated with photosensitive seizures. The patches are small and local rather than full screen, and the peak is moderate rather than white on black. If flashing imagery is a problem for you, the text below carries the whole result and you do not need to run it.
What you should see
The first three patches look close to equally bright despite one being eight times the peak intensity of another, because each delivers the same energy inside the integration window. The fourth, at 200ms, is past the window and reads as a longer, dimmer event rather than a flash.
Two things have to be right for that to be true on a screen. The energy is held constant in linear light, the physical output, and only encoded for the display at the end. Held constant in pixel values instead, the display's gamma curve would make the 25ms patch put out about three and a half times the light of the 200ms one. And a 60 Hz display cannot show a 25ms flash at all, since a frame lasts 16.7ms. Each frame shows the share of its own interval the flash covered, which keeps the light summed over the frames exact, spread across two or three of them.
The arithmetic you actually need
Below the critical duration, perceived brightness follows the product of intensity and time, where intensity means emitted light, not the value you write to the pixel:
I * t = constant (for t below ~100ms)
// so, at 60fps:
1 frame (16.7ms) needs 6x the amplitude of a 6 frame flash
2 frames (33.3ms) needs 3x
4 frames (66.7ms) needs 1.5x
Which is the practical trap. A one frame hit tuned by eye at 60fps and then shipped at 30fps doubles in duration and therefore in perceived strength. The same effect is not the same effect on a different display.
Why this matters beyond feel
It cuts both ways. A punch that is too short and not bright enough is invisible, and tuning it by adding more frames is the wrong axis if what you wanted was a snap. Equally, brightening a short flash to make it land can push it into a range that is a genuine accessibility problem, and the safe answer there is almost always fewer, slower, smaller and lower contrast rather than a shorter spike.
Rules of thumb
- Under about 100ms, intensity and duration trade one for one. Halve the time, double the amplitude, in linear light.
- Author flashes in seconds, never in frames, or the effect changes strength with frame rate.
- Past roughly 100ms extra duration stops adding punch and starts adding presence.
- Keep repeated flashing under 3 Hz, and keep it local rather than full screen.
- Ship a reduce-flashing setting and make it do something real, not just lower the alpha slightly.
If you find anything wrong, let me know at hello@andrewdetwiler.com and I'll get it updated.
One email when something new goes up. No newsletter, no schedule, nothing else.
Double opt-in, so watch for a confirmation email. Unsubscribe any time.