Investigate: particle FPS cost in its various forms (count, overdraw, glow, textures, shadows, crowds) -- measure, then file fixes #435
Labels
No labels
amd
avatars
bug
builder
cannot-reproduce
crash
epic
feature
from-viewer
gl-removal
known-limitation
monitoring
parity
perf
platform
priority
critical
priority
high
priority
low
priority
medium
provenance
rendering
rt
status
in-progress
status
testing
status
up-next
triage
ui
upstream
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sky_line/Slipstream#435
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Investigation: measure how particles affect frame rate (CPU and GPU) in the different forms they take in SL, find the expensive cases, and file targeted fixes.
Where particles live in Slipstream
llviewerpartsim.cpp/llviewerpartsource.cpphandle sources (llParticleSystem), per-particle updates, lifetime, and theRenderMaxPartCountcap (the quality slider sets it, 0-8192).llcleanparticlestore.cpp(GPU particle pools: thepartVRAM category; the "emit live/peak/4096" store in the VKMem log), particle compute + indirect draws (recordParticleCompute,releaseParticles,RenderVKOverlapParticlesasync/overlap), particle shadow casters, and particle coverage written into the TAA reactive / coverage mask.alfloaterparticleeditor.cpp), for building test emitters.Cases to measure
For each case, record CPU frame time (main thread), GPU time per pass (the particle compute, particle draw, shadows, TAA/FSR, post), particle count / emitter count, and overdraw:
ShowSelectionBeam/EnableSelectionHintspaths).Method
RenderMaxPartCount0 vs default vs max) and resolution 1080p vs 4K (for fill rate).perf/ Tracy zones (add zones around the part sim update and the particle upload if missing).Likely fixes to evaluate (file separately once measured)
RenderMaxPartCountper quality level; maybe a ladder step under GPU pressure (#422 auto-tuner, #405).Done when
Started 2026-10-10. Measured in a busy scene (RTX 5090, 3840x2088): particle pass 29.3 ms of a 44 ms GPU frame, ~12 fragment-shader invocations per pixel from ~4.8k particle triangles (682 emitters, ~5.4k live particles). Both overdraw and per-fragment cost are high. In progress: per-vertex particle lighting, a half-resolution particle path with depth-aware upsample, and near-camera fade for screen-filling sprites.
Pushed to main at
07c8a3ac73. Per-particle lighting in a compute pass (RenderVKParticleLighting), coarse shading on particles (RenderVKParticleShadingRate), adaptive half-resolution particles with depth-aware upsample (RenderVKParticleLowRes, auto at about 2 layers per pixel) and near-camera fade. Same busy sim: particle pass 29.3 ms -> about 0.6 ms, frame 44 ms -> 12.3 ms (22 -> 81 FPS). To test: particle looks (glow, underwater, mirror, snapshot) and a window resize.Particle pass 29.3 ms -> ~0.6 ms in the measured busy sim (lighting compute pass, shading rate, adaptive low-res); shipped in v1.3.0-beta.1. Closing.