Nightjar 4.1.1 is a latency and accuracy release for Android, Android TV, Windows and Linux. The smoothing mode no longer costs latency, echo cancellation now works on phones whose own canceller misses the game sound, 60 Hz screens judder less, and the performance overlay stops flagging things that aren't faults. It updates in place over 4.1.0 and keeps your PCs and settings.
Highlights
- Show frames at the PC's frame times is about 5 ms faster, close to Lowest latency, on hosts with phase lock such as Rubylight.
- Echo cancellation that works: Nightjar's own canceller, fed exactly what Nightjar plays, removed 25 dB of echo on a Retroid Pocket 6 where Android's removed 6.6 dB.
- Fewer judders on 60 Hz screens: about 3x fewer frames more than 8 ms off in the smoothing mode.
- An overlay that reads like other clients: a stream faster than your screen no longer turns the status dot amber, and Display wait and Client latency count only Nightjar's own time.
Latency and frame timing
- Show frames at the PC's frame times keeps phase lock on, as Lowest latency does: the PC times its frames to arrive just before your screen's refresh, so frames reach the screen about 5 ms sooner in this mode. On a steady link it is as smooth as before; with simulated Wi-Fi stalls slightly more frames are off than before (2.5% against 1.9%), and Lowest latency stays the smoother choice there (0.8%).
- Show frames at the PC's frame times on 60 Hz screens: no more delay building up to 50 ms at 60 fps, and far fewer dropped frames.
- Phase lock leaves more room before each refresh at 60 fps on a 60 Hz screen, so fewer frames miss it.
- Android 13 and newer: frame timing follows Android's own deadline for each refresh.
- Video receive reuses its buffers for every packet and frame, including frames repaired from lost packets: on Windows, Nightjar used 6.5% less CPU in our test with 1% packet loss.
Performance overlay
- A stream faster than your screen no longer turns the overlay's status dot amber; the overlay says the screen's refresh rate instead ("60 Hz screen"). Frames missing below the screen's rate still turn it amber or red.
- Display wait and Client latency now end when Nightjar hands a frame to Android, as they already did with the Vulkan renderer and in Nightjar for Windows and Linux. Android's compositor and the screen's own delay come after that and are left out; the log keeps them.
- Client latency starts when the frame is complete, so it is queue wait, decode and display wait together; the time the frame's packets take to arrive belongs to the network.
- Statistics ends the stream line with the received frame rate, and the host's present-to-send line is now called "Host incl. send".
- Debug: "On screen" is now "Presented", estimated display drops show as a share of a two-second window instead of a total for the whole stream (five seconds behind, since a drop is only known once the screen's report fails to come), and judder says "not measured" when the stream is faster than the screen. End-to-end latency lines say "(end to end)".
- Debug timings show the average, median and p95, so one slow frame no longer dominates the row.
Microphone
- Echo cancellation takes the stream's sound out of the microphone with Nightjar's own echo canceller, fed with exactly what Nightjar plays. Android's echo canceller hears only what the phone routes to it, and on some phones that leaves the game sound out, so the setting made no difference there (Rubylight#56).
- With echo cancellation on, your voice is recorded without Android's call processing.
Desktop (Windows and Linux)
- A setting a game, PC or profile inherits opens with a controller too, and only picking a new value overrides it. Before, pressing A on such a setting could quietly pin it for the whole PC, so games looked stuck at an old frame rate (#55).
- The game page and settings say when a value comes from this PC or a profile.
- With a menu open, B or Esc closes only the menu.
Fixes
- A game cover Android can't read no longer closes Nightjar; the game shows no cover, as with a damaged file.
Tested. On a Retroid Pocket 6 at 60 Hz against Rubylight 3.1.1, with on-screen times from Android's SurfaceFlinger: Show frames at the PC's frame times took 27.8 ms (median) and 31.0 ms (95th percentile) from the PC to the screen instead of 33.0 and 41.0 ms, against 26.8 and 30.1 to 30.9 ms with Lowest latency, with 0.54% of frames more than half a refresh off against 0.51%. In the same mode at 60 fps, frames more than 8 ms off fell from 2.35-2.95% to 0.84%, while Lowest latency measured no worse (host to render 6.67 ms median against 6.77). Echo cancellation removed 25 dB of a test signal against 6.6 dB with Android's canceller. The receive path made 0 allocations over four test rounds where it made 124 (H.264) and 452 (PyroWave); desktop Nightjar on a Radeon 780M laptop used 8.62 s of CPU against 9.22 s with 1% loss, and PyroWave's 99th percentile on the Retroid fell by 0.67 ms. Nightjar for Windows on the laptop measured no worse with the new 60 Hz timing. The Android unit tests, lint and both release builds pass, and Nightjar desktop's 816 tests pass.