One Clock¶
How the whole face is advanced together, so a character moves the same at any frame rate, and so you can cut what it costs without changing how it looks.
This is the least visible thing in FaceCue and one of the most consequential. It is the reason a line you tuned on your machine looks the same on a player's.
The Problem It Solves¶
Left to themselves, each part of a face times itself against the frame rate.
That sounds harmless and is not. The mouth is the fastest-moving thing on a face, and fast mouth motion is exactly what suffers: on a high-refresh screen the same line comes out softer. The motion you tuned at 60 frames is not the motion somebody sees at 144.
What FaceCue Does Instead¶
The whole face runs on one clock, kept by the brain, so what a character does depends on how much time has passed and not on how often the machine happened to ask.
That clock also keeps its place around your animation and your game code, which is why FaceCue composes with animation you have authored instead of fighting it. That has a page of its own: Working With Your Animation.
This Is Why the Performance Is Visually Consistent
With one clock, frame rate stops being an input to the performance. A slow machine and a fast one produce the same face, and a recording made on either matches.
It is also what makes the editor preview worth trusting: the Cue Clip Composer plays a line through the same discipline the build will.
Two Rates¶
The clock has two dials, under Facial Timestep on the brain, and they cost different things.
Calculation Rate is how many times per second the simulation advances: how often the face decides what it is doing. Output Rate is how many times per second the finished face is written to the character. Output never runs faster than calculation, and when the game runs slower than either the face writes at the game's own pace instead.
Both are quality dials, not frame rates. Whichever you pick, the performance stays visually consistent across machines, because the rate is a property of the character and not of the hardware. What changes is how fine the motion is, and what it costs.
Calculation Rate¶
Higher is more precise during fast speech. Lower is coarser on rapid mouth movement. If a character's mouth looks soft on quick dialogue, this is the thing to raise.
It is not free. What it costs is the character's own calculation, mostly the eyes and the speech, so it depends on what the character is running rather than on the size of its rig.
What We Saw
In our own testing, raising the Calculation Rate above the Output Rate only made a visible difference when the output rate was very low, 15 or less, and we still wanted rapid gaze tracking and wildly varied, loud speech to stay faithful. Even then we kept it at 30, or 60 at most, and 60 was only slightly better than 30. How much you see will depend on your characters and your scene, so test it in your own.
We suggest keeping it around 60, and not above 120. Setting the Calculation Rate to Output keeps the two together, so every calculation is one the character shows.
Output Rate¶
This dial's cost is tied most to the character, and much of FaceCue's optimisation goes into keeping it down.
Writing the face means moving every blendshape the character is driving. So the cost rises with how many blendshapes move per second, and the output rate is the multiplier. It moves all of them that many more times a second. A character with a large expressive rig pays more per write than a simple one, and doubling the rate doubles it. It is one of the few costs in FaceCue that varies from character to character, which is why it is worth knowing about.
What We Saw
In our tests, an output rate of 30 looked almost indistinguishable from higher rates, even at relatively close range. Going up from there brought diminishing returns, though how much you see of them will depend on your characters and your scene.
At 15, with Display Smoothing on, the performance still reads as smooth motion. Without smoothing it moves in steps, every blendshape landing where it should and held until the next write, and the steps stop showing once the character is far enough away that its face is small on screen.
Below 15 we would only suggest it for specific optimisation cases, and FaceCue already ships some: the distance policy, off by default, comes with a suggested table that drops distant characters that far, and you can reshape it per character around your own priorities.
A lower rate makes the character coarser and cheaper. It gives up less than it sounds. The clock still shows the character where it should be at each moment, and Display Smoothing fills in between, so the motion looks as smooth as a higher rate. The rate is the character's budget, and a faster game does not raise it. When a game cannot keep up, FaceCue can adjust the rate for a while, to keep the motion smooth or to spend less, and puts it back once the game catches up. That is Clock Adaptation below.
Display¶
The Output Rate dropdown has one option that is not a number. Display ties the character to the rate the game is set to run at, rather than to a fixed number of writes a second, so every write lands on a frame. A fixed rate the frames cannot divide, for example 60 writes on 72 frames a second, still looks smooth, because Display Smoothing evens it out. An output rate that matches the game's frame rate needs no smoothing, and is spared its cost and its delay. Choosing Display also sets the Calculation Rate to Output, so the character is calculated on the same beat it is written.
That rate is a setting, not a measurement. It is the rate the game asks for. With vSync on that is most likely the screen's refresh rate, and otherwise the target frame rate you or the player have set. On a headset it is the refresh rate the headset is set to. Two things it is not. It is not the monitor's own ceiling, so a 144 Hz monitor with the game set to 60 gives 60. And it is not the frame rate the game is managing at the time, so a game set to 60 that is only reaching 45 still gives 60.
Display Divisor is the share. Full writes on every frame, Half on every second frame, Quarter on every fourth. On a headset running at 120 frames a second that is 120, 60 or 30 writes a second, each one on a frame. Half is the usual choice. It costs half of Full and still lands on a steady beat.
Rate Range, an Advanced row beside these, keeps Display between 30 and 120 writes a second out of the box, whatever the game is set to. Display on Half with the game set to 30 frames a second still writes 30, on every frame, and a player who sets 240 on a high-refresh screen gets 120 at most. A game running slower than 30 is written on every frame it shows.
Display Smoothing¶
Display Smoothing keeps the motion smooth whenever the writes and the frames on screen do not line up, whether the screen runs ahead of the writes, the frames cannot divide the rate, or the game is dropping frames. It smooths the whole character, the face, the head and the bones FaceCue moves, so even at an output rate as low as 15 it stays faithful to a much higher one. Auto smooths only while it is needed, so a character keeping pace with the screen pays nothing.
Clock Adaptation¶
Everything above is what the character is configured to run at. A game does not always hold to it, so Clock Adaptation moves the character off those rates when the frames the game actually shows call for it, and back again once they no longer do. Two things call for it: frames the game shows without drawing them, and a game falling behind.
Generated Frames¶
Some games show more frames than they draw. Under load, a standalone headset such as a Quest can generate frames in between the ones the game draws, with Application SpaceWarp, so the player sees the full rate while the game draws half of it. Generated Frames decides how the character keeps time across them. The frames a standalone headset generates are the ones FaceCue recognises.
We recommend leaving it on Auto, which writes the character only on the frames the game draws. That costs the least and adds no delay.
Frame Drops¶
A game falling behind shows its frames slower than the character is written, and unevenly. Some frames carry one write and others two, and the motion steps. Frame Drops decides what happens then.
We recommend leaving it on Auto, which writes the character less often while the game is behind, only as far as the frames need, and smooths it onto them, so the motion stays even. While the rate is lowered, the character is calculated in step with it, keeping the same proportion between the two. With Display Smoothing set to Off, Frame Drops does not smooth either, so the motion can still step.
Freeze Blend¶
Clock Rate also holds Freeze Blend (ms), which is a length of time rather than a rate.
A freeze stops everything FaceCue contributes. No simulation runs, nothing is written, and the character's facial cost drops to essentially zero. What a freeze does not do is snap. Over this blend the face fades onto the body's own pose while it keeps running, then stops. On the way back it fades in from wherever the body left the head, so a body the animator kept moving is picked up, not snapped to. What a freeze means for your animation is on Working With Your Animation, and what triggers one is below.
Variation¶
Everything in FaceCue that varies, blink timing, idle drift, the small differences between two identical phonemes, is drawn at random, so a performance never repeats itself exactly and a crowd does not move as one.
Where those draws come from is set under Facial Timestep, in its Variation section, as Seed Mode:
- Shared draws from Unity's own random stream, together with everything else in the scene. Two copies of a character still do not move in step, but the same run will not come out the same way twice.
- Unique, which a new character starts on, gives each character its own stream, worked out from the character itself with nothing to author. A crowd built from one prefab does not blink in lockstep. Stable for a session, not across sessions.
- Custom uses the Seed you type, exactly, so the same character moves the same way run after run. Worth setting for a cutscene you intend to record. Two characters given the same seed move identically.
Making It Cheaper¶
The rates above are what a character costs while it is on screen and close to the camera. Most characters in a scene spend much of their time somewhere else, behind the camera, round a corner or far in the background, and two policies on the brain spend less on them. Both are set per character.
Visibility Freeze¶
A face nobody can see does not need to move. Visibility Freeze stops a character once no camera has seen it for a short while. Nothing is simulated and nothing is written, so it costs next to nothing, and it comes back the moment it is seen again. It does not snap either way. As it stops, the face fades onto the body's own pose, and as it returns, it fades back in from wherever the body left the head.
It is on by default. A character that has to keep moving while nobody sees it can have it switched off.
Distance Rate Limiting¶
A face far from the camera is small on screen, and the fine detail in its motion is lost on the viewer. Distance Rate Limiting writes such a character less often, through a table of rates by distance and by what the character is doing: speaking, following a look target, or idling. Far enough away, a cell can stop the character entirely. The distance is counted through the camera's lens, so a camera zoomed in on a distant character treats it as near.
It is off by default. Switching it on gives you a suggested table to start from. It leaves a character close to the camera at its full rates, and it never freezes one that is speaking, because a voice carries further than a face can be seen. The table is per character, so a hero can keep its rates while a crowd is cut hard.
How each one decides what counts as seen, the suggested table itself, and what each saves are under Optimization on Performance.