Skip to content

Nightcap v0.3.0

Choose a tag to compare

@github-actions github-actions released this 19 Sep 00:25
· 146 commits to main since this release
8bde1a1

Added

  • Custom Discord presence. integrations.discord_rpc.text.title replaces the
    name in "Playing Nightcap", and integrations.discord_rpc.images sets 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, and text.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: false the 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.md
    describes the benchmark runs, and scripts/summarize_profile_trace.py
    turns 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 vkQueueSubmit fell 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. Set
    pin_cores=no in ~/.config/gamemode.ini to keep GameMode without the
    pinning, or performance.gamemode: on to accept it. See
    docs/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_REST forces a mode; see
    docs/PERFORMANCE.md.
  • ETC2 uploads with a bufferRowLength or bufferImageHeight larger 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 --profile trace gains a pump slice for the engine's main-thread
    step.