This guide covers which elements “cost” the most framerate to enable, and some best practices to keep you running at a solid 60!
Effects, in order of costliness
Let’s start by giving the really quick-and-dirty breakdown of what costs the most resources to render on the GPU. We’ll get into GPU versus CPU performance bottlenecks, what those words mean, and a lot more detail about tuning these elements later.
- Note lights
- Large impact lights with shadows
- Light bars with “Light” components, such as Piano Highlight
- Large particles, such as Steam or Dry Ice
- Normal impact lights with shadows
- Very large long-duration pulses, such as Giant Circle
- Light bars containing Plasma or Wisp sub-components
- Particles in general
- Impact lights with small radius and no shadows
Functionally-free items you should never need to disable
- Note objects
- Normal pulses
- Light bars containing only Core or Gradient sub-components
- Piano keys
How to think about performance
Ok, with that out of the way, I want to take a bit of time to explain the words I’m using and lay the groundwork on how to think about framerate and performance. Fair warning, everything is going to be a huge oversimplification targeted at folks with zero familiarity on this topic!
Keysight is, essentially, a video game.It’s built in a game engine, it uses dynamic inputs to make effects happen. Therefore, the general pipeline that your computer needs to work through to deliver a frame is as follows:
- – The CPU (Central Processing Unit) figures out what needs to happen, such as where note objects need to move to, which effects need to spawn, etc. Essentially all the “non-visual” stuff. This is commonly referred to as the “Game” thread.
- – This information from the CPU is then passed on to the GPU (Graphics Processing Unit). This is commonly referred to as the “Draw” thread.
- – The GPU then “renders” (draws) pixels based on this information. This is commonly referred to as the “GPU” thread.
Keysight does have to simulate a lot of things on the CPU, but typically it is the GPU that is limiting the framerate due to the nature of how difficult it is to render lights and particles and things. This meat of this guide will be on reducing the “cost” on the GPU, but let’s quickly look at how to tell whether you’re GPU or CPU “bottlenecked”.
First of all, Keysight’s stock behaviour is to have “v-sync” enabled. This prevents Keysight from delivering more frames than the refresh rate of your monitor (typically 60hz, so the framerate will be locked to around 60fps or frames-per-second). We’ll want to turn this off to figure out what your performance is limited by, and how much headroom you have. While we’re in here, we also want to turn on the framerate counter (this can be toggled with the C key too) and Test Preset in the top right, to generate some load on Keysight.
The green numbers on the right are how we can break down whether we’re limited by the CPU or GPU, and generally how good our performance is. I would recommend having a “safety factor” of at least 50% above your desired framerate while in the standard test preset mode. By this I mean if you want 60fps, make sure you can comfortably run Keysight at 90fps while it’s running in an unlocked framerate.
262.53 FPS <-- Framerate, for this given frame 3.81 ms <-- Time taken for this frame to be delivered ("frametime") Frame: 3.81 ms <-- Time taken for this frame to be delivered Game: 1.57 ms <-- Time taken to simulate the current frame's information on CPU Draw: 2.26 ms <-- Time taken for the CPU to load data into the GPU GPU: 3.82 ms <-- Time taken for the GPU to render the pixels for this frame
This is the raw timing data reported by the engine. It changes every frame, so it can be a little hard to read without freeze-framing it, but the important thing is to get a rough feel for which numbers are bigger than other numbers on the Game, Draw and GPU portions versus the final frame time. These “threads” all run parallel to each other, so a frame is prevented from being delivered any faster than the slowest (or biggest) of these numbers here.
In the above example, the GPU thread is clearly the largest number, and about the same as overall frame delivery time, so we can safely conclude that we are “GPU-bound” and if we reduce the load on the GPU, we can gain more framerate.
246.32 FPS <-- Framerate, for this given frame 4.06 ms <-- Time taken for this frame to be delivered ("frametime") Frame: 4.03 ms <-- Time taken for this frame to be delivered Game: 3.94 ms <-- Time taken to simulate the current frame's information on CPU Draw: 3.59 ms <-- Time taken for the CPU to load data into the GPU GPU: 4.04 ms <-- Time taken for the GPU to render the pixels for this frame
In THIS example, things are a lot less clear. An important thing to note here: if you are bound by the Game/Draw thread, the GPU thread will also slow down to the equivalent speed. This means if your Game/Draw thread time is roughly equal to the GPU thread, you do not know if you are both CPU and GPU bound, or just CPU bound. This is what is happening in this situation.
We can dig a bit deeper and figure out if it’s CPU or GPU by pausing Keysight with the left arrow key. As this stops almost all simulation and stops new things having to be loaded into the GPU via the Draw thread, it drastically reduces our Game and Draw thread cost. However, the GPU is still having to render each frame the same as before (even though nothing is moving). Therefore, if pausing Keysight this way gives a massive framerate bump, congratulations, you were CPU-bound! If not, you just happened to be balancing the cost for CPU and GPU almost perfectly, and if you need more framerate you will need to reduce the load on all threads.
But how do we do that?
Reducing CPU performance cost
Honestly there’s not a lot you can do here.
- Reduce overall PC load. Close any unnecessary applications, that sort of thing. If you’re struggling to run Keysight due to CPU performance, chances are that even something like Chrome could be “heavy” and should be closed if possible.
- Anything to increase CPU single threaded performance (Keysight is dual-threaded, “Game” and “Draw”, but typically “Game” is much higher than “Draw” so it’s functionally single-threaded for simulation). Outside of buying a new CPU or overclocking though, this is not really possible.
- Reduce the time that effects are on-screen. Fewer objects in the scene means less calculation per-frame. Avoid particle systems or pulses with a long life-time (so the effect doesn’t stick around too long after you’re done playing that note), increase note speed to get notes off-screen faster.
- Reduce number of effects spawned per note. It’s very easy to dump in 7 pulses and 3 particles to a preset, but simulating all of these is going to be expensive on the CPU as well as the GPU.
- Avoid per-frame effects. These include colour modes like Cycling, or dynamic-response Velocity. The biggest killer to CPU performance is usually enabling “Use dynamic note strength over time” for particles.
Reducing GPU performance cost
- Reduce the resolution of Keysight. GPU performance cost scales almost linearly with pixel count under most situations, so if you half the number of pixels you can double the GPU performance. If streaming, question whether you NEED Keysight to be in 1080p as opposed to 720p. You can also reduce “resolution scale” under Graphics to reduce pixel count without changing the window size (this functionally alters the internal resolution Keysight renders at before scaling it to your window size. ~70% will give you 720p if the window is 1080p).
- Adjust the active area height to match the amount of Keysight you are actually using. I very commonly see streamers cropping Keysight at the top to fit their layout, but if Keysight is still rendering pixels in those cropped sections then it is costing performance.
The easiest method for doing this is simply to use the Graphics presets. I would recommend “Ultra” for any competent gaming-grade desktop PC from the last 5 years, “High” for gaming laptops, and “Low” for older computers or computers not intended for gaming. These graphics presets automatically adjust all default presets to reduce or remove effects relevant to their tier. However, if you want to manually adjust things:
- Avoid dynamic lighting. This comes from three effects: Note Lights, Impact Lights, and Light Bars which contain a Light component. Lighting is by far and away the biggest GPU performance cost in Keysight, and Note Lights are the most costly of the bunch. Consider using emissive note objects (so you can see them with no lighting) and disabling Note Lights as the first step towards gaining more GPU performance.
- Disable shadows for impact lights. Or just disable them entirely of course. Shadow casting is quite costly, reducing the resolution or disabling them entirely under Graphics > Quality will help with framerate.
- Reduce the radius of impact lights. Lights cost more the more objects they shine upon, so reducing the radius of any light sources will improve performance but it is easiest to do this for impact lights.
- Avoid lots of semi-transparent surfaces being overlaid on top of one another. This primarily relates to particles and sometimes pulses. The cost for rendering a pixel skyrockets if that pixel contains 100 surfaces to figure out, and this can easily happen if you use a particle system with a high spawn count and a large particle size. All native smoke/steam type particles in Keysight are finely tuned to give the best visual appearance with the least number of particles balanced against particle size, but they’re still quite expensive. The same thing can happen with pulses, although it requires some goofy pulses to have a ton of them overlaid (see: Candy preset).
- Avoid really high particle spawn counts,even with tiny particles with little overlap. Particles are simulated on the GPU, so this is a unique situation where the GPU is responsible for both the “source” simulation data and the rendering thereof. Fewer particles means less GPU particle simulation strain, although usually the cost for rendering a particle versus simulating it is much higher so your performance gains here are likely to come from not rendering transparent surfaces so much.
- Avoid Light Bars with plasma/wisps that cover a large portion of the screen. Both Plasma and Wisp components use a very expensive-per-pixel material, so spreading this across lots of pixels will drastically increase the scene’s render cost.
- Unlock the framerate, press C to monitor frametimes
- If GPU is highest, you are GPU bound. If Game/Draw ~= GPU, you are possibly CPU bound
- To improve CPU performance:
– Close other programs on your PC
– Reduce effect count
– Avoid per-frame effects like dynamic note strength on particles
- To improve GPU performance:
– Reduce Keysight resolution
– Only use the active area you need
– Avoid dynamic lighting
– Avoid high particle spawn counts with large sizes
– Disable shadow casting
– Don’t use huge light bars with Plasma/Wisps
This is all we can share for Basics – Performance – Keysight for today. I hope you enjoy the guide! If you have anything to add to this guide or we forget something please let us know via comment! We check each comment! Don’t forget to check SteamClue.com for MORE!
- All Keysight Posts List