Flicker has published thresholds, so use them
Making something pulse is the cheapest way to draw the eye, so it ends up everywhere: warnings, pickups, low-health vignettes, rate meters, transitions. There are published numbers for when that becomes a problem, they are specific, and almost nobody building an effect has them to hand.
Both halves read as alive from across a room. Only one of them is a luminance flash, and the right one would still be safe if you tripled its rate.
The numbers
WCAG 2.3.1 draws the line at three flashes in any one second, and 2.3.2 takes the stricter position of no flashing above three per second at all. A "flash" in that definition is not any change: it is a relative luminance change of 10% or more, where the darker state is below a relative luminance of 0.80, over a region larger than about 25% of a 10 degree visual field.
Two consequences fall straight out of that and they are the practical half:
- Area is part of the threshold. A small pulsing icon is not the same object as a full-screen flash, and the standard says so explicitly. A rate meter across the bottom of the screen can cross the area bar without anyone thinking of it as full-screen.
- Saturated red is called out separately. Transitions to and from saturated red have their own rule because they provoke a stronger response than the same luminance change in another hue. Damage flashes and alarm states are exactly where this lands.
The band that matters is roughly 3 to 30Hz, worst around 15 to 20. Below 3 is safe by the standard. Above about 50 the eye fuses it and it stops being a flash at all, but a game cannot rely on that because frame rate is not a constant.
Where this hides in a field renderer
The effects most likely to cross the line are not the ones anyone would describe as flashing:
- Anything driven by a rate. A meter or indicator whose blink speed encodes a value will walk through the whole band as the value changes, and it is fastest exactly when things are most urgent.
- Stepping on twos or threes. Animating at 12 or 8Hz is a deliberate stylistic choice and sits inside the band. It is fine when it is motion; it is not fine when it is also a luminance swing.
- Sparks, embers, muzzle flashes, impact frames. Individually small. Collectively a large area changing luminance several times a second.
- Alternating two-frame effects. A hit flash that toggles white every other frame is a 30Hz square wave over whatever area the character covers.
- Low-health vignettes, which are large area, red, and usually pulse faster as the situation worsens. All three rules at once.
What to modulate instead
The useful reframing is that attention is drawn by change, and luminance is only one of the things available to change. These read nearly as strongly and are not flashes:
- Size. A shape breathing 10% is highly visible in peripheral vision, which is where you wanted it noticed anyway.
- Position. A small oscillation is one of the strongest peripheral cues there is.
- Rim or outline width at constant fill brightness, which is what the right half above does.
- Hue at constant luminance. Genuinely constant, which means checking it in a linear space rather than by eye.
- Slowing down. 2Hz is below the threshold, and for most indicators it looks better than 6Hz anyway.
Testing it without instruments
A frame-differencing pass over a capture gets you most of the way: render the effect, compute mean luminance per frame over the region, and look at how many times per second it swings by more than 10%. That is a short script, it runs on a video file, and it turns an argument about whether something is too much into a number.
The Harding test is the industry instrument for this and broadcasters require passing it. It is worth knowing it exists before shipping something with a lot of combat flash, though for most work the frame-difference check catches the problem long before anyone needs it.
And the honest note: this page exists because a demo elsewhere on this site had rate bars pulsing at 8 to 12Hz, squarely inside the band, two pages away from a warning about exactly that. Writing the rule down is not the same as following it, which is why the check needs to be mechanical.
Rules of thumb
- Three flashes per second is the line. Below 3Hz is safe by the standard.
- A flash is a 10% relative luminance change over more than about a quarter of the field. Area is part of the definition.
- Saturated red has its own stricter rule. Damage and alarm states are where that bites.
- Anything whose blink rate encodes a value will sweep the entire risk band. Clamp the rate, not just the maximum.
- Modulate size, position, rim width or hue instead. They draw the eye about as well and none of them is a flash.
- Measure it by frame-differencing a capture. An opinion about whether it is too much is not a check.
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.