A rapid-fire-tech-talk by Spencer Carver
December 16, 2016
The Problem we're trying to solve:
This is (mostly) fine for television, but not for Virtual Reality.
The 3 VR Platform Approaches
Oculus Rift
HTC Vive
Playstation VR
Lock Hardware to 45 FPS
Interpolate to 90 FPS
Lock Hardware to 60 FPS
Interpolate to 120 FPS
Allow Hardware to render as many 'game frames' as possible
ATW to 90 FPS
Some Math
90 Frames
≈
1 Second
11 ms per frame
However, this is the time that we need the frame to be done by, NOT how much time ATW has to operate.
ATW is running on a separate thread and needs to know if there is another 'game-frame' coming before the deadline.
If there isn't it needs to preempt the GPU's current animation and put in the filler frame. This means we need to poll.
ATW Experimentation
By experimentation, Oculus determined that polling the GPU every 2ms to determine when a new frame is being processed gives enough time for the asynchronous thread to render the filler frame, and also appropriately preempt.
This is only possible on Windows 8+ at the moment, as it was the first major OS to support preemption at a fine enough granularity for single frames.
Limitations
And the biggest limitation of all....
Asynchronous Timewarp Only applies to rotational movement in VR. Any positional / translational movement, will cause the filler to fail, introducing judder such as below:
Source: Oculus
To eliminate this judder, you need another process running an algorithm Oculus has dubbed:
A rapid-fire-tech-talk by Spencer Carver
December 16, 2016
(This one is really just black magic)
Source: Oculus
An example
Source: Oculus
An example (side-by-side)
Another Example
Source: Oculus
Sources