mirror of
https://github.com/InstanceBrick/nightcap.git
synced 2026-10-22 08:00:58 +02:00
15 KiB
15 KiB
Changelog
All notable changes to Nightcap. The format follows Keep a Changelog. Release notes on GitHub are taken from the matching section here.
Unreleased
Changed
- The Flatpak build asks for the X11 socket only when there is no Wayland session, as before 0.3.3.
Fixed
- Fixed a random crash on Wayland with NVIDIA drivers, where the game window
closed after you let go of the camera or left mouse lock. The log showed
wp_linux_drm_syncobj_surface_v1error 3. - Fixed some menu actions being ignored. The Chat button on a profile now opens the Party tab with that player, and clicking a search suggestion now runs the search instead of closing the search menu.
- Fixed possible crashes when the game calls an Android function Nightcap did not provide, or releases the same reference twice.
- Fixed a possible hang on close when a web view process stayed open. Nightcap now stops waiting for the log writer after 2 seconds.
- Fixed a possible missing picture on graphics drivers that reject the low-latency present mode. Nightcap now retries with the game's own mode.
- Fixed a possible Wayland crash when the window first appears on the OpenGL graphics path.
0.3.3 - 2026-10-04
Added
- Joining a friend from a Roblox "follow user" link now works. Nightcap looks up which game they are in and joins it.
- Nix users get a desktop entry for the app.
Changed
- Roblox textures now decode about 3 times faster, which shortens the stalls when a place loads and when new parts of the map stream in. Thanks to @glook9001.
Fixed
make update-robloxno longer deletes your previous Roblox install when an import fails partway through. If a step fails, the old files are put back, or kept in a folder whose path is printed. Thanks to @kimlherme.- A failed Roblox update now restores your previous version's records instead of leaving them half switched. A damaged version file is rejected instead of being half read, and a temporary failure to start the startup check no longer marks a working Roblox build as broken for good. Thanks to @kimlherme.
- Fixed a possible crash when Roblox clears its audio queue while sound is still playing, and a memory leak in lists of objects passed to Roblox's Java code. Thanks to @kimlherme.
- Fixed a possible crash when the text overlay shuts down, a freeze when Roblox releases the mouse lock while another release is already in progress, and network lookups that misread Roblox's options. Thanks to @kimlherme.
- Fixed the sky sometimes rendering with the wrong textures in the Vulkan renderer.
- Clicking while a Roblox text box has focus no longer closes it. Only Roblox decides when a click ends typing.
- Going to another page in the web view, such as Friends from a profile, no longer closes the web view. It crashed on every page change on Wayland systems whose GL setup GTK could not use.
- Fixed a crash when Roblox's saved dark or light theme setting was missing or damaged.
0.3.2 - 2026-09-29
Added
- Performance recordings made with
--profilenow show how busy the CPU was during each frame, which makes it easier to tell what caused a stutter. - Experimental support for ARM64 (
aarch64) Linux, running Roblox's Androidarm64-v8aclient.
Fixed
- When Roblox asks for a Google Play device check during login, Nightcap now answers right away that it isn't supported. Before, the "Verifying you're not a bot" screen waited about a minute for an answer and then sent you back to the login screen.
- Solving a login challenge now closes its window. Before, Roblox's "challenge completed" signal was ignored and the window stayed open. Thanks to @glook9001.
- Login no longer stalls after you pass a verification check. Before, Roblox only saw the page's "challenge completed" signal after a one-minute timeout, so it gave up and the login failed. On a Roblox build Nightcap can't handle this way, the log says "WebViewProtocol getter not recognized" and web pages behave as before.
- Login check windows and other web pages get 5 seconds to start instead of 3, so a slow start no longer closes them. The log says how long each one took to open.
- Less stutter while joining a game and while textures load in. In Blade Ball, loading hitches dropped by about half, and the worst one went from 0.8 seconds to 0.55 seconds.
- Clicking Play on a private server now joins right away. Before, nothing happened until you clicked a sidebar tab like Home.
- Middle click now reaches Roblox as the middle mouse button.
- Scrolling follows your system's natural scrolling setting.
- Fixed a crash on some x86_64 hosts when Roblox asked about a thread other than the one making the call.
- Roblox updates no longer mix up the ARM64 and x86_64 compatibility profiles for the same version.
- A partial or out-of-range user id in
MOCKTAIL_ROBLOX_USER_IDorMOCKTAIL_LOCAL_STORAGE_CURRENT_USER_IDis now ignored instead of being partly read.
Changed
make flatpakandscripts/build_flatpak.shnow build with 2 jobs by default instead of 4, so a local Flatpak build is less likely to run out of memory. SetFLATPAK_JOBSorMOCKTAIL_FLATPAK_JOBSto use more. Thanks to @glook9001.
0.3.1 - 2026-09-20
Added
- Each release carries a DEB, an RPM, and a pacman package beside the
AppImage, with a
.sha256for every file. They install/usr/bin/mocktailand conflict with each other and with upstream'smocktailpackage. Nightcap is in no distribution repository or the AUR; the recipes underpackaging/aur/nightcap{,-bin,-git}build from this repository locally. - The AppStream metadata lists the Nightcap releases, so software centres show the release history instead of upstream's.
Fixed
- ETC2 texture decoding no longer blocks the thread that submits the frame.
Uploads decode on a background dispatcher and the submit carries a timeline
semaphore wait, so the GPU waits for the texture instead of the render
thread. Reading the application's compressed bytes moves to that dispatcher
too whenever they are already mapped. In Blade Ball the worst
vkQueueSubmitfell from 140ms to 1ms, its p99 from 4.9ms to 0.05ms, and the total time spent in submits from 2534ms to 309ms. Frame interval is unchanged: the remaining tail is the engine's own main-thread step. A device without thetimelineSemaphorefeature decodes inline as before, as does a submit whosepNextalready sizes arrays by its semaphore counts. - The mouse pointer jumped when a right-click camera drag ended, and drifted to the viewport edge during one. The input router inferred pointer capture from SDL reporting zero absolute coordinates, which holds on X11 but not on Wayland, where the reported position accumulates the relative deltas and leaves the window. Motion, button, and wheel events now carry the window's relative mouse mode. The right-click camera fallback also only captures inside an experience, so the cursor stays free over the app surface.
- Shutting the window down while an experience was starting or leaving could free the pointer capture owner underneath the thread using it. Callers off the SDL thread now hold a reference for the length of their call.
- The TextBox caret did not move when a trailing space was typed in a single-line field. The final cluster rect SDL_ttf reports stops at the last inked glyph, so the laid-out width is used there instead. Wrapped layouts keep the clamp, because their width is the widest line rather than the last.
- Every TextBox keystroke re-ran
TTF_Init, a fontconfig sort, sixTTF_OpenFontcalls, andTTF_Quiton the render thread. The overlay holds its opened fonts and reopens them only when the Roblox font or the point size changes, keeping the current set when a reopen fails. Measured over 100 rasters, 1.59ms to 0.12ms per keystroke. - Staged ETC2 copies now carry an explicit host-write barrier. A queue submission only makes host writes from before it visible to the device, and an asynchronous decode writes after the submit, so without the barrier those texels were not guaranteed to reach the copy that reads them.
Changed
docs/PERFORMANCE.mddocuments the GameMode settings to run with. Adesiredgov=powersavein~/.config/gamemode.inioverrides the packagedperformancedefault and clocks the CPU down for the whole session while still reporting an active performance request.
0.3.0 - 2026-09-18
Added
- Custom Discord presence.
integrations.discord_rpc.text.titlereplaces the name in "Playing Nightcap", andintegrations.discord_rpc.imagessets the large and small icons and their hover text. Text and image fields accept{place_name},{place_icon}, and{creator_name}. A field that expands an empty placeholder is left out, andtext.state: ""hides the state line. - The default Discord card now matches Sober: the title is "Roblox", the
details line is "Playing ", the state is "by ", and
the Roblox badge sits inside the experience icon. The creator comes from the
same Roblox games request that already fetches the experience name. With
show_place_name: falsethe creator is hidden too, so the card shows only the title and timer. --profile <file>writes a Chrome-format trace of the Vulkan adapter's work: presents, GPU waits, submits, ETC2 texture decode, and pipeline and shader creation. Open it in ui.perfetto.dev.docs/BENCHMARKING.mddescribes the benchmark runs, andscripts/summarize_profile_trace.pyturns traces into a before and after table.
Fixed
- Texture uploads stalled the frame they were submitted on. ETC2 batches
decoded on worker threads but were then resampled one upload at a time on
the submitting thread, which at the default 4x upscale is sixteen times the
decoded texels. Resampling now runs on the same worker pool, in two passes so
mip level 0 still resolves before the mips built from it. In a 70k-part
place the worst
vkQueueSubmitfell from 167ms to 92ms. - Most ETC2 batches decoded on a single thread. Workers were created and joined per batch, so the parallel floor had to cover that cost and sat at a 1024x1024 image; batches under it ran on the caller, which was 54% of all decode time in a 70k-part place. Decode workers are now a persistent pool, and the floor drops to a 128x128 image. Mean decode time in that place fell from 8.2ms to 4.7ms, and 11.8ms before both texture fixes.
- On CPUs with a wide core-speed spread, Feral GameMode pinned the process to
the few fastest cores, concentrating Roblox's worker pool onto them instead
of spreading it. With
performance.gamemode: auto, a request that narrows the CPU affinity is now released again, which releases the pin. Setpin_cores=noin~/.config/gamemode.inito keep GameMode without the pinning, orperformance.gamemode: onto accept it. Seedocs/PERFORMANCE.md. - With
show_place_name: false, Discord no longer shows the experience thumbnail or its name on hover. - The host main thread no longer spins on the engine's message pump, which
cost about half a core and 146,000 empty calls a second. It now rests 100 µs
between polls: sleeping when the governor is
performance, parking the core with TPAUSE on CPUs that have it, spinning otherwise. With GameMode setting the governor, process CPU in a 60k-part place fell from 216% to 107% at the same 120 fps.MOCKTAIL_ENGINE_PUMP_RESTforces a mode; seedocs/PERFORMANCE.md. - ETC2 uploads with a
bufferRowLengthorbufferImageHeightlarger than the image read the padded rows as packed data and decoded garbage. - ETC2 resampling created and joined worker threads on every batch. It now runs on the persistent decode pool.
- A failed trace write left the profile writer thread waking every 250 ms for the rest of the session. It now exits.
- The
--profiletrace gains apumpslice for the engine's main-thread step.
0.2.0 - 2026-09-16
Added
- FAQ covering Discord RPC, log locations, and VR, adapted from upstream.
input.raw_mouseinconfig.yamlsends mouse look deltas in the host's own units. Turn it on when first-person aiming feels too slow or too fast under fractional display scaling. Off by default.- Nightly AppImage builds, published as the
continuousprerelease. They are untested; use a tagged release for normal play.
Changed
- Values in
fflags.jsonnow win over the performance preset instead of stopping the launch. Startup prints each key it kept. - Discord Rich Presence uses Nightcap's own Discord application, so it shows as "Playing Nightcap". Terms and privacy pages for it live on the project site.
- Discord Rich Presence is on by default. Set
integrations.discord_rpc.enabled: falseto turn it off. - The AppImage build verifies its reduced dependency packages against digests taken at build time, rather than a digest list kept in the repository.
Fixed
- Mouse look keeps responding after a long turn. The tracked pointer position could drift past the edge of the view, which swallowed every reversal until the mouse travelled all the way back.
- Nightcap no longer refuses to start with
cannot lock appStorage. It created its own credential directory using the process umask, then rejected that directory for being group writable. Systems with a permissive umask, such as002, failed on first run.
0.1.0 - 2026-09-15
First Nightcap release, forked from komaruworld/mocktail.
Added
- ETC2 and EAC texture emulation on Vulkan, so games that use compressed mobile textures render correctly on desktop GPUs. Decoding runs on worker threads to avoid stutter.
- PNG texture overrides in
~/.config/mocktail/textures, keyed by upload hash, with a dump mode to find the texture you want to replace. - Small textures are upscaled 4x by default. Set
MOCKTAIL_SMALL_TEXTURE_UPSCALE=1to turn it off. - AppImage and signed Flatpak builds on every release tag. The Flatpak repo is published at https://coderdayton.github.io/nightcap/.
- Roadmap in
docs/ROADMAP.md.
Changed
- Frames are presented as soon as they are ready instead of waiting in a queue, which lowers input latency.
- Roblox now sees the real host RAM and display size instead of a low-end phone profile.
- App ID is
io.github.CoderDayton.nightcap, so Nightcap installs next to upstream Mocktail. The binary and config paths keep themocktailname. - New name, icon, and colors.
- The desktop entry launches on Wayland and points at the installed binary.
Fixed
- Servers no longer kick with error 319 shortly after joining.
- The FMOD output-device bridge is optional, so the updater no longer fails without it.
- The AppImage build no longer fails on stale checksums for the slimmed Arch packages.