Difference between revisions of "Smooth Quake"

From QWiki
*>Ruskie
 
(155 intermediate revisions by 11 users not shown)
Line 1: Line 1:
This page contains solutions and tips for various tearing, lagging, jerky and sucky Quake configurations.
+
This page contains solutions and tips for various tearing, lagging, jerky and sucky Quake configurations.<br>
 +
'''Some of the tunings are for advanced users only. Do not change anything unless you know what you are doing.'''
  
== Operating system independant ==
+
== Hardware ==
===Independent physics===
+
===Sync technologies===
You can find lots of tips for the ezQuake client in the [http://ezquake.sourceforge.net/docs/?independent-physics Independent Physics Guide].
+
* Vertical syncronization (vsync) should be disabled while playing. It causes input lag.
  
===Common tips===
+
* FreeSync and G-Sync/compatible provide a tearless image. It will keep your fps and monitor Hz synced without additional input lag.
* '''More FPS''' = smoother quake. See below for details.
 
* Use '''maximum vertical refresh frequency''' of the screen
 
* Make sure that '''no other program is running''' when you run quake. They steal your CPU and therefore make FPS hits.
 
* Turn off '''vertical synchronization''' on your graphics card settings and also in ezQuake by setting vid_vsync 0.0.  If you want to keep things smooth but not suffer the quality loss of turning vsync off, enable double/tripple buffering.  In software rendering version you have to use -dibonly command line options and vid_nopageflip 1 setting.
 
  
===FPS Limit Fine-Tuning===
+
* Black Frame Insertion (BFI) strobes the backlight synchronized with Hz for CRT-like motion clarity (cathode-ray tube).<br> Brands use different names for BFI. This adds a bit of input lag and creates a double image effect called crosstalk.<br>However, as of 2023, Nvidia launched ULMB2 which looks very promising without these downsides.<br><br>[https://www.youtube.com/watch?v=evjZGLdqUu8 Nvidia ULMB2 announcement]<br>[https://youtu.be/3Cykx2GQq4k Optimum Tech ULMB2 comparison]
Especially with LCD devices be aware if your FPS limit (cl_maxfps) is a multiplication of your display refresh frequency. For example using 75 Hz display refresh frequency and FPS limit 225 (= 3*75) will be significantly different from using 235 FPS. Usually players prefer to use multiplication of their display refresh frequency - 2*75, 3*75, 3*60, and so on, not the other way round.
 
  
===Control CPU Sharing===
+
===Monitor===
Because your CPU needs to be shared with different system applications - including system services - it gives you another place to fine-tune smoothness of your Quake configuration. You can get into following situations.
+
Ideally, an IPS panel with at least 240Hz minimum is recommended. But any 144hz or more screen will work great!<br>
 +
'''Why IPS?''' TN has bad colors and viewing angles, VA has slow response time and OLED has burn-in risk and is expensive.<br>
 +
The pixels response time must stay inside the refresh cycle (1000/Hz) to avoid blur and take full advantage of the monitor's Hz.<br>
 +
'''Example''': the refresh cycle of a 240hz monitor is 1000/240='''4.16ms''', if the pixel response time is above that, its going to generate blur.<br>
 +
You can read about the pixel response time for your monitor [https://www.rtings.com/monitor/tests/motion/motion-blur-and-response-time here]. Sort the column by rise/fall time.<br>
 +
Some monitors have a fast enough response time but at the cost of ghosting. Take this into account.<br>
 +
[https://www.testufo.com/ghosting#background=004040&separation=160&pps=1080&graphics=bbufo.png&pursuit=1 UFO Test] shows how your monitor responds so you can select a proper overdrive setting.<br>
 +
''Example products'': Asus VG279QM [https://www.aperturegrille.com/reviews/ASUSVG279QM/ Aperture Grille's review].
  
* Both Quake and background services get enough CPU time and everything runs smooth
+
===Mouse===
* Other applications get too much CPU time while the Quake engine needs more so the rendering gets jerky
+
Any modern mouse should be ok.<br>
* Other applications do not get enough CPU time and for example your mouse/keyboard input is delayed for more then a second
+
Most mouse companies add smoothing after a certain DPI level (usually 1800) but a few brands have it disabled for all DPI ranges.<br>
 +
Smoothing is basically input lag. It's added in the firmware, not the sensor.<br>
 +
You should only use '''native DPI values''' to avoid interpolation. 1000Hz and DPI of 800 minimum is recommended.<br>
 +
A good mouse should not have problems such as smoothing, angle snapping, jitter and DPI deviation.<br>
 +
''Example products'': Pixart 3389 sensor (1600 DPI no smoothing added).<br>
  
To control how CPU should be shared when Quake is running you can use ways described below.
+
[https://www.youtube.com/watch?v=6AoRfv9W110 Battle(non)sense DPI analysis]<br>
 +
[https://www.youtube.com/watch?v=imYBTj2RXFs Optimum Tech DPI analysis]
  
====Quake CPU yielding====
+
===Keyboard===
 +
1000Hz minimum is ideal simply because it has lower input lag than regular 125hz keyboards. [https://www.youtube.com/watch?v=UmS_t3YYy8s Explanation].<br>
 +
Note: with 1000Hz+ mouse and keyboard you should use [https://forums.blurbusters.com/viewtopic.php?f=10&t=7618 separate dedicated usb chips] or a PCIe USB card.<br>
 +
''Example products'': EVGA Z20 and Corsair K70 Rapidfire/Champion models are fast but expensive.<br>
 +
<br>
 +
== Software ==
 +
Do not change anything unless you know what you are doing!<br>
 +
===BIOS===
 +
Suggestions:
 +
* Spread Spectrum: Disable
  
If you use FPS limitation (cl_maxfps), you can control what happens in the moment when the client finished rendering the current frame and it has nothing to do until it's a right time to start rendering the next frame. Either it can run in a loop or it can give CPU to other applications. To control it use <code>sys_yieldcpu</code> variable. Setting it to 0 will not give the CPU to other applications and vice versa.
+
* Extreme Memory Profile (XMP): Enable
  
====OS-specific settings====
+
===Windows===
 +
Suggestions:
  
Other settings depend on the Operating system you are using. See below for OS-specific tips.
+
Installation<br>
 +
1. Download original Windows iso with MediaCreationTool from MS and install.<br>
 +
2. Install [https://www.techpowerup.com/download/visual-c-redistributable-runtime-package-all-in-one/ Visual C].<br>
 +
3. Install all WUpdates including drivers.<br>
  
==Linux==
+
Settings
 +
* Start > Settings > Update & Security > '''Delivery Optimization''' > Disable
 +
 
 +
* Start > Settings > Privacy > '''Background apps''' > Disable all but Windows Security and NVCP.
 +
 
 +
* Start > Settings > Apps > '''Startup''' > Disable what you don't need.
 +
 
 +
* Start > Settings > Accessibility > Keyboard > '''Sticky Keys''' > Disable the shortcuts.
 +
 
 +
* Start > Settings > System > Display > Graphics Settings >  '''GPU Scheduling''' > Enable
 +
 
 +
* Control Panel > Mouse > Pointer Options > '''Enhance pointer precision''' > Disable
 +
<br>
 +
Services<br>
 +
(disable what you don't use)
 +
* TCP/IP NetBIOS Helper (also in: protocol tcp/ipv4 > advanced settings > wins)
 +
 
 +
* Touch Keyboard and Handwriting Panel Service
 +
 
 +
* Windows Search (Indexer is only required if you search your directories and files)
 +
<br>
 +
Integrity<br>
 +
(by this order in cmdline as admin)
 +
 
 +
1. DISM /Online /Cleanup-Image /CheckHealth<br>
 +
2. DISM /Online /Cleanup-Image /ScanHealth<br>
 +
3. DISM /Online /Cleanup-Image /RestoreHealth<br>
 +
4. sfc /scannow<br>
 +
5. findstr /c:"[SR]" %windir%\Logs\CBS\CBS.log >"%userprofile%\Desktop\sfcdetails.txt"
 +
 
 +
===NVIDIA===
 +
Suggestions:
 +
* NVCP > Global Settings > OpenGL GPU > '''Nvidia''' (to avoid issues with integrated cards being used)
 +
<big></big>
 +
* NVCP > ezQuake profile > OpenGL GDI compatibility > '''prefer compatibility'''
 +
<big></big>
 +
* NVCP > ezQuake profile > Power management mode > '''prefer maximum performance''' (sets gpu at max frequency)
 +
<big></big>
 +
* NVCP > ezQuake profile > Texture filtering > Negative LOD bias > '''clamp'''
 +
<big></big>
 +
* NVCP > ezQuake profile > Threaded Optimization > '''on''' (disable this setting if ezQ gets sluggish/stutters)
 +
<big></big>
 +
* NVCP > ezQuake profile > Vulkan/OpenGL present method > '''prefer native'''
 +
<big></big>
 +
* [https://github.com/Orbmu2k/nvidiaProfileInspector/releases NvidiaProfileInspector] > Other > '''Maximum Frames Allowed''' = '''1''' (Pre-rendered frames for OGL. Low Latency Mode is for DX)
 +
<big></big>
 +
 
 +
===AMD/ATI===
 +
''(to be added)''<br>
 +
<br>
 +
== ezQuake ==
 +
You should have a frametime of 1.3ms with 1001 fps and ping deviation less than 0.6ms.<br>
 +
During certain transitions some minor tearing appears in the middle of the screen but barely noticeable.<br>
 +
You can use multiples of 77 (server updates) that get close to your monitor Hz for a smoother image.<br>
 +
These are the closest fps with the off values for common Hz.<br>
 +
 
 +
144Hz: 1001 (-7) ; 1155 (+3)<br>
 +
165Hz: 1155 (0)  ; 2310 (0)<br>
 +
240Hz: 1925 (+5) ; 2156 (-4) ; 4081 (+1)<br>
 +
280Hz: 2233 (-7) ; 3080 (0)<br>
 +
360Hz: 1078 (-2) ; 2156 (-4)<br>
 +
480Hz: 1925 (+5)<br>
 +
500Hz: 1001 (+1) ; 2002 (+2)<br>
 +
540Hz: 1078 (-2) ; 1617 (-3) ; 2156 (-4)
 +
 
 +
===Launch===
 +
GPU (ATI and NVIDIA) sends interrupts to '''cpu0'''.<br>
 +
Any ezQuake threads that land there can cause instability leading to a small interruption with a small fps drop.<br>
 +
Excluding it for ezQuake will stabilize frametime. This can be better observed streaming with OBS Studio.<br>
 +
[https://bitsum.com/tools/cpu-affinity-calculator/ CPU affinity calculator] shows you what hexadecimal value you need to set in cmdline after ''/affinity'' (replace the word ''<HexVal>'' with the value you got from the calculator without all the starting 0x0 zeros). If your cpu has Hyper-Threading you need to exclude cpu0 and cpu1.<br>
 +
Ex.: A CPU with 4 cores and Hyper-Threading (8 threads) the hexadecimal is FC. With 4 cores and no HT the hexadecimal is E.<br>
 +
You can change '''Windows power plan''' to High Performance while playing and restore it back to Balanced when finished.<br>
 +
Open command line and type ''powercfg -l'' to see their GUID. They should match the ones below.<br>
 +
 
 +
To switch power plans open notepad and place these 3 lines (without the comment), change game path, and save as '''.bat''' extension:<br>
 +
 
 +
<small>''powercfg -s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c (#high performance power profile)<br>
 +
start "" /wait /affinity <HexVal> "<your Quake path and executable, ex.: D:\Quake\ezquake.exe>"<br>
 +
powercfg -s 381b4222-f694-41f0-9685-ff5bb260df2e (#balanced power profile)''</small><br>
 +
 
 +
If you always use power plan High Performance just right click ezquake.exe > send to > desktop (create shortcut) with this cmdline:<br>
 +
 
 +
<small>''%ComSpec% /C start "" /affinity <HexVal> "ezquake.exe"''</small><br>
 +
 
 +
===Settings===
 +
Suggestions:
 +
 
 +
''cl_maxfps 1001''          (minimum recommended)<br>
 +
''cl_newlerp 0.1''          (smooths projectiles movement)<br>
 +
''gl_clipparticles 0''<br>
 +
''r_particles_count 16384'' (is just a limit, won't affect performance if particles don't reach it)<br>
 +
''r_dynamic''              (1 = cpu ; 2 = gpu: recommended)<br>
 +
''gl_anisotropy 16''        (Note: fps consuming)<br>
 +
''gl_lerpimages 0''<br>
 +
''gl_texturemode gl_linear_mipmap_linear'' (always use mipmap or fps will drop alot)<br>
 +
''gl_brush_polygonoffset 0''<br>
 +
''gl_outline 0''            (1 = models ; 2 = world ; 3 = models + world ; Note: fps consuming)<br>
 +
''r_farclip 8192''<br>
 +
''sys_yieldcpu 0''          (set 1 if you feel input lag)<br>
 +
''gl_multisamples 0''      (Note: fps consuming)<br>
 +
''vid_framebuffer 0''      (enable if you want gl_outline for world. Note: fps consuming)<br>
 +
''vid_gammacorrection 0''<br>
 +
''vid_grab_keyboard 0''    (causes several issues if enabled)<br>
 +
''vid_hwgammacontrol 2''<br>
 +
''vid_renderer 1''<br>
 +
''vid_software_palette 0''  (can cause white pixels if enabled. Note: fps consuming)<br>
 +
''vid_usedesktopres 1''<br>
 +
''s_khz 48''<br>
 +
''s_linearresample 0''<br>
 +
''s_desiredsamples 512''<br>
 +
''gl_hwblend 1''<br>
 +
''gl_polyblend 0''<br>
 +
''vid_hwgamma_fps 1''<br>
  
See [[Smooth Quake in Linux]]
 
  
== Windows ==
+
'''Tools to check performance:'''<br>
 +
* ''timedemo2 <demo> <fps>'' (add 77 as fps after the demo name ; bind a key with "disconnect" to stop it anytime ; don't use timedemo cmd)
 +
* ''hud_frametime'' (combine with hud_frametime_max_reset_interval 2 and hud_performance_average 0)<br>
 +
* ''hud_fps'' (combine with hud_fps_drop -1 and hud_fps_style 2)<br>
 +
* ''hud_net''<br>
 +
* ''hud_ping'' (combine with hud_ping_show_dev 1 and hud_ping_show_pl 1)<br>
 +
* ''hud_speed''<br>
  
====Quake Priority====
+
===Mouse Input===
 +
Use ''in_raw 1'' (default) for Raw mouse input. This should provide the cleanest mouse input data, as opposed to what SDL input provides with ''in_raw 0'', which might suffer from Windows's built-in  acceleration curves and other limitations.
 +
<br><br>
  
You can try changing Quake process priority. You do that with the <code>sys_highpriority</code> variable in FuhQuake and ezQuake clients. Try all values from within the set -1, 0 and 1. Also you may try more specific values by selecting your client process in the ''Task Manager'' and changing it's priority in there. ''Task Manager'' gives you 6 possible priority settings.
+
== Issues ==
 +
===Network: lag spikes===
 +
* '''Proxy''': with default [[nQuake]] settings, the server browser automatically finds proxies. It can connect to a server using more than one.<br>Follow these steps to know if one of them is the culprit.<br><br>1. Console > ''hud_net_show 1'' (If "dev" is 1ms+, type ''cl_proxyaddr'' and write IPs down)<br>2. Server Browser > select a server > press 'enter'<br><br>In the help shortcut keys box, route indicates how many proxies were found. Press 'n'. This will connect directly bypassing proxies.<br>If deviation improves then some proxy causes issues.<br>With the IPs you wrote, set ''cl_proxyaddr'' with just one until you find wich one is bad. ''Sb_ignoreproxy'' can exclude it from future updates.
 +
[[File:Server shorcut keys.jpg|frame|center|Keyboard shortcuts in ezQuake server browser]]
 +
* '''Network Throttling (NT)''': If ezQ is running on the same cores where network data is processed, sys_yieldcpu 0 will cause deviation.<br>You can keep NT and sys_yieldcpu 0 if you exclude cpu0 (see ezQ launch section) and Receive Side Scaling (RSS) queue is set to 1.<br> If you want RSS queue >1 then set sys_yieldcpu 1 or disable NT.<br><big></big>''Winkey+R > regedit > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile > NetworkThrottlingIndex'' = [10-70] range in decimal and default is 10 ; ffffffff in hexadecimal to disable.
 +
<big></big>
 +
* '''Interrupt Moderation (IM)''': If you have a setting to define the rate, the higher the value the more delayed packets are.<br>Some drivers have a buggy implementation. If you notice issues or want to be safe, disable in ethernet properties.<br>
 +
<br>
 +
As an example, here are the settings tested with Xperf for the ethernet driver (ndis.sys). Values are shown in microseconds (usecs).<br>
 +
NT off causes more latency. IM rate is minimum.
 +
A good combination for these values is NT 70 + IM off or minimum.<br>
  
====System CPU Sheduling====
+
[[File:NTI and IM.jpg|thumb|center|DPC with Xperf]]
  
In Windows it's possible to set preferred way for '''CPU sheduling''' in your Control Panel - System - Advanced tab - Performance - Advanced tab and choose if ''Programs'' or ''Background services'' should be preferred. The default setting for workstation computers is to prefer ''Programs''. However this doesn't mean that this value is recommended.
+
===Network: packet loss===
 +
First, disable UDP checksum offload to see if it's a driver/ethernet bug. If it's not, turn it back on.<br>
 +
If you are experiencing packetloss, you can try to connect to a proxy. But if the problem is your own connection, this won't do anything.<br>
 +
In this situation it makes sense to duplicate (''dupe'') the network packets sent ''from and to'' the QuakeWorld server, so less packets are lost.<br>
 +
'''Dupe''' commands expect a numeric argument ([1-3] range). The numeric argument represents the number of duplicate packets.<br>
 +
The default is of course '''0''', representing 0 duplicated packets.
 +
* Console > '''setinfo dupe 1''' (This tells the server to send to your client 1 duplicated packet). Set it in ''cl_onload'' alias for permanent use.<br>
 +
* Console > '''cl_c2sdupe 1''' (This tells your client to send to the server 1 duplicated packet). This is a client setting, so it is saved in your cfg file.
 +
<br>
 +
Note: Ensure you have at least ''/rate 50000''. To duplicate packets will increase your bandwidth needs. In case your ''rate'' is not enough for the number of packets being received/sent, '''rate cut''' will happen.
 +
[[File:Rate_cut.png|frame|center|The yellow lines on the netgraph represent rate cut. You can also see the absolute value, 18%]]
  
== Macintosh ==
+
===Performance: unstable FPS===
Ezquake is in general the recomended client, but you can also try fuh if everything fails :P
+
If you feel like the game runs smooth for a while but you recognize small disturbing semi-periodic interrupts, those can be caused by background apps. Open Task Manager (ctrl+alt+del) and check whether some other processes are consuming cpu.<br>
Binary version of Fuhquake > http://dreamolers.binaryriot.org/fuhquake/
 
  
== Debugging/solutions for Certain hardware ==
+
* Start > Admin Tools > Event Viewer > Windows Logs: when you get an fps drop, check the time and see if there is a log that matches it.
if you get pixels in ezquake, try gl_ztrick 0 or 1
 
  
== Tools ==
+
* Start > Admin Tools > Task Scheduler > Library: check for tasks from apps you installed that match the Event Viewer logs.
If you dont have quake installed already use [[NQuake]] as the installation media.
 
* http://nquake.com
 
  
If you have an ATI or NVIDIA card you should always install their official (proprietary, only in binary form) drivers to get the highest fps. There's also a popular 3rd party driver with some optimizations for ATI/NVIDIA. It comes with various tools for adding modelines and overclocking; (note that r200 is fully supported in linux with the opensource x.org driver)
+
* Uninstall or disable any RGB software (monitor; mouse; keyboard). It causes issues with the system.
* http://www.nvidia.com/content/drivers/drivers.asp
 
* http://ati.amd.com/support/driver.html
 
* http://www.omegadrivers.net/
 
  
 +
* [https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer Process  Explorer] can set low priority for I/O and memory of processes with the background priority, reducing the impact on the system.<br>
 +
<br>
  
Also dont forget to install soundcard/motherboard/chipset drivers from the hardware manufacturer's site. They also tend to have a FAQ or something similar there. To identify the hardware on Linux, run <code>lspci</code>. Windows has a built-in one in the control panel, but it's not the greatest so there might be some good 3rd party tools.
+
== Advanced Windows Settings ==
* Powerstrip or PCWizard or newest Nvidia drivers - With these programs u can fine-tune your display frequency. If you dont use independent-physics, it might be a good idea to set your quake's resolution display frequency to 77hz. Or 154 if you have at least 19' monitor.
+
Do not change anything unless you know what you are doing!
These tools are good to clean up space/bogus stuff in Windows that can steal precious fps:
 
*[http://www.ccleaner.com/ ccleaner ]
 
*[http://www.lavasoftusa.com/ adaware ]
 
  
If nothing helps please come to irc  on #qwhelp or #qwrookie and we will try to fill in the missing pieces
+
* [https://riverar.github.io/insiderhubcontent/memory_compression.html Memory Compression]: Although it's recommended there might be situations where de/compress causes latency. Your mileage may vary.<br>Start > Windows PowerShell (as admin):<br>> Get-MMAgent<br>> Disable-MMAgent -mc<br>> Enable-MMAgent -mc<br>
 +
<big></big>
 +
* [https://forums.guru3d.com/threads/windows-line-based-vs-message-signaled-based-interrupts-msi-tool.378044/ Message Signaled Interrupts]: Change supported devices to MSI. A negative value means it's working. Do not enable devices if the supported modes field doesn't include MSI. Windows sets interrupt priority of SATA to high. Leave the rest as undefined.
 +
<big></big>
 +
* Telemetry: This doesn't cause performance issues but if you want to completely disable it, this method is safe and reversible.<br>- Winkey+R > services.msc > Connected user experiences and telemetry > Disable (default auto)<br>- Task Scheduler Library > Microsoft > Windows > Autochk / Customer Experience Improvement Program > Disable all tasks<br>- HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows > New Key > DataCollection > New DWORD (32-bit) > AllowTelemetry = 0<br>(Grays out the selectable options in Settings > Privacy > Diagnostics & feedback > Diagnostic data)
 +
<br>
 +
 
 +
==Other OS==
 +
===Linux===
 +
See [[Smooth Quake in Linux]]
 +
 
 +
=== Mac ===
 +
(to be added)<br>
 +
<br>
 +
==Finding help==
 +
[[Discord]]<br>
 +
[[Streaming]]<br>
 +
[https://ezquake.com/docs.html ezQuake documentation]<br>
 +
[https://www.quakeworld.nu/ Quakeworld.nu]
  
 
[[Category:Tutorials]]
 
[[Category:Tutorials]]
 +
 +
Link to a previous version of this page now obsolete: [[Older Smooth Quake]]

Latest revision as of 10:00, 28 April 2024

This page contains solutions and tips for various tearing, lagging, jerky and sucky Quake configurations.
Some of the tunings are for advanced users only. Do not change anything unless you know what you are doing.

Hardware

Sync technologies

  • Vertical syncronization (vsync) should be disabled while playing. It causes input lag.
  • FreeSync and G-Sync/compatible provide a tearless image. It will keep your fps and monitor Hz synced without additional input lag.
  • Black Frame Insertion (BFI) strobes the backlight synchronized with Hz for CRT-like motion clarity (cathode-ray tube).
    Brands use different names for BFI. This adds a bit of input lag and creates a double image effect called crosstalk.
    However, as of 2023, Nvidia launched ULMB2 which looks very promising without these downsides.

    Nvidia ULMB2 announcement
    Optimum Tech ULMB2 comparison

Monitor

Ideally, an IPS panel with at least 240Hz minimum is recommended. But any 144hz or more screen will work great!
Why IPS? TN has bad colors and viewing angles, VA has slow response time and OLED has burn-in risk and is expensive.
The pixels response time must stay inside the refresh cycle (1000/Hz) to avoid blur and take full advantage of the monitor's Hz.
Example: the refresh cycle of a 240hz monitor is 1000/240=4.16ms, if the pixel response time is above that, its going to generate blur.
You can read about the pixel response time for your monitor here. Sort the column by rise/fall time.
Some monitors have a fast enough response time but at the cost of ghosting. Take this into account.
UFO Test shows how your monitor responds so you can select a proper overdrive setting.
Example products: Asus VG279QM Aperture Grille's review.

Mouse

Any modern mouse should be ok.
Most mouse companies add smoothing after a certain DPI level (usually 1800) but a few brands have it disabled for all DPI ranges.
Smoothing is basically input lag. It's added in the firmware, not the sensor.
You should only use native DPI values to avoid interpolation. 1000Hz and DPI of 800 minimum is recommended.
A good mouse should not have problems such as smoothing, angle snapping, jitter and DPI deviation.
Example products: Pixart 3389 sensor (1600 DPI no smoothing added).

Battle(non)sense DPI analysis
Optimum Tech DPI analysis

Keyboard

1000Hz minimum is ideal simply because it has lower input lag than regular 125hz keyboards. Explanation.
Note: with 1000Hz+ mouse and keyboard you should use separate dedicated usb chips or a PCIe USB card.
Example products: EVGA Z20 and Corsair K70 Rapidfire/Champion models are fast but expensive.

Software

Do not change anything unless you know what you are doing!

BIOS

Suggestions:

  • Spread Spectrum: Disable
  • Extreme Memory Profile (XMP): Enable

Windows

Suggestions:

Installation
1. Download original Windows iso with MediaCreationTool from MS and install.
2. Install Visual C.
3. Install all WUpdates including drivers.

Settings

  • Start > Settings > Update & Security > Delivery Optimization > Disable
  • Start > Settings > Privacy > Background apps > Disable all but Windows Security and NVCP.
  • Start > Settings > Apps > Startup > Disable what you don't need.
  • Start > Settings > Accessibility > Keyboard > Sticky Keys > Disable the shortcuts.
  • Start > Settings > System > Display > Graphics Settings > GPU Scheduling > Enable
  • Control Panel > Mouse > Pointer Options > Enhance pointer precision > Disable


Services
(disable what you don't use)

  • TCP/IP NetBIOS Helper (also in: protocol tcp/ipv4 > advanced settings > wins)
  • Touch Keyboard and Handwriting Panel Service
  • Windows Search (Indexer is only required if you search your directories and files)


Integrity
(by this order in cmdline as admin)

1. DISM /Online /Cleanup-Image /CheckHealth
2. DISM /Online /Cleanup-Image /ScanHealth
3. DISM /Online /Cleanup-Image /RestoreHealth
4. sfc /scannow
5. findstr /c:"[SR]" %windir%\Logs\CBS\CBS.log >"%userprofile%\Desktop\sfcdetails.txt"

NVIDIA

Suggestions:

  • NVCP > Global Settings > OpenGL GPU > Nvidia (to avoid issues with integrated cards being used)

  • NVCP > ezQuake profile > OpenGL GDI compatibility > prefer compatibility

  • NVCP > ezQuake profile > Power management mode > prefer maximum performance (sets gpu at max frequency)

  • NVCP > ezQuake profile > Texture filtering > Negative LOD bias > clamp

  • NVCP > ezQuake profile > Threaded Optimization > on (disable this setting if ezQ gets sluggish/stutters)

  • NVCP > ezQuake profile > Vulkan/OpenGL present method > prefer native

  • NvidiaProfileInspector > Other > Maximum Frames Allowed = 1 (Pre-rendered frames for OGL. Low Latency Mode is for DX)

AMD/ATI

(to be added)

ezQuake

You should have a frametime of 1.3ms with 1001 fps and ping deviation less than 0.6ms.
During certain transitions some minor tearing appears in the middle of the screen but barely noticeable.
You can use multiples of 77 (server updates) that get close to your monitor Hz for a smoother image.
These are the closest fps with the off values for common Hz.

144Hz: 1001 (-7) ; 1155 (+3)
165Hz: 1155 (0) ; 2310 (0)
240Hz: 1925 (+5) ; 2156 (-4) ; 4081 (+1)
280Hz: 2233 (-7) ; 3080 (0)
360Hz: 1078 (-2) ; 2156 (-4)
480Hz: 1925 (+5)
500Hz: 1001 (+1) ; 2002 (+2)
540Hz: 1078 (-2) ; 1617 (-3) ; 2156 (-4)

Launch

GPU (ATI and NVIDIA) sends interrupts to cpu0.
Any ezQuake threads that land there can cause instability leading to a small interruption with a small fps drop.
Excluding it for ezQuake will stabilize frametime. This can be better observed streaming with OBS Studio.
CPU affinity calculator shows you what hexadecimal value you need to set in cmdline after /affinity (replace the word <HexVal> with the value you got from the calculator without all the starting 0x0 zeros). If your cpu has Hyper-Threading you need to exclude cpu0 and cpu1.
Ex.: A CPU with 4 cores and Hyper-Threading (8 threads) the hexadecimal is FC. With 4 cores and no HT the hexadecimal is E.
You can change Windows power plan to High Performance while playing and restore it back to Balanced when finished.
Open command line and type powercfg -l to see their GUID. They should match the ones below.

To switch power plans open notepad and place these 3 lines (without the comment), change game path, and save as .bat extension:

powercfg -s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c (#high performance power profile)
start "" /wait /affinity <HexVal> "<your Quake path and executable, ex.: D:\Quake\ezquake.exe>"
powercfg -s 381b4222-f694-41f0-9685-ff5bb260df2e (#balanced power profile)

If you always use power plan High Performance just right click ezquake.exe > send to > desktop (create shortcut) with this cmdline:

%ComSpec% /C start "" /affinity <HexVal> "ezquake.exe"

Settings

Suggestions:

cl_maxfps 1001 (minimum recommended)
cl_newlerp 0.1 (smooths projectiles movement)
gl_clipparticles 0
r_particles_count 16384 (is just a limit, won't affect performance if particles don't reach it)
r_dynamic (1 = cpu ; 2 = gpu: recommended)
gl_anisotropy 16 (Note: fps consuming)
gl_lerpimages 0
gl_texturemode gl_linear_mipmap_linear (always use mipmap or fps will drop alot)
gl_brush_polygonoffset 0
gl_outline 0 (1 = models ; 2 = world ; 3 = models + world ; Note: fps consuming)
r_farclip 8192
sys_yieldcpu 0 (set 1 if you feel input lag)
gl_multisamples 0 (Note: fps consuming)
vid_framebuffer 0 (enable if you want gl_outline for world. Note: fps consuming)
vid_gammacorrection 0
vid_grab_keyboard 0 (causes several issues if enabled)
vid_hwgammacontrol 2
vid_renderer 1
vid_software_palette 0 (can cause white pixels if enabled. Note: fps consuming)
vid_usedesktopres 1
s_khz 48
s_linearresample 0
s_desiredsamples 512
gl_hwblend 1
gl_polyblend 0
vid_hwgamma_fps 1


Tools to check performance:

  • timedemo2 <demo> <fps> (add 77 as fps after the demo name ; bind a key with "disconnect" to stop it anytime ; don't use timedemo cmd)
  • hud_frametime (combine with hud_frametime_max_reset_interval 2 and hud_performance_average 0)
  • hud_fps (combine with hud_fps_drop -1 and hud_fps_style 2)
  • hud_net
  • hud_ping (combine with hud_ping_show_dev 1 and hud_ping_show_pl 1)
  • hud_speed

Mouse Input

Use in_raw 1 (default) for Raw mouse input. This should provide the cleanest mouse input data, as opposed to what SDL input provides with in_raw 0, which might suffer from Windows's built-in acceleration curves and other limitations.

Issues

Network: lag spikes

  • Proxy: with default nQuake settings, the server browser automatically finds proxies. It can connect to a server using more than one.
    Follow these steps to know if one of them is the culprit.

    1. Console > hud_net_show 1 (If "dev" is 1ms+, type cl_proxyaddr and write IPs down)
    2. Server Browser > select a server > press 'enter'

    In the help shortcut keys box, route indicates how many proxies were found. Press 'n'. This will connect directly bypassing proxies.
    If deviation improves then some proxy causes issues.
    With the IPs you wrote, set cl_proxyaddr with just one until you find wich one is bad. Sb_ignoreproxy can exclude it from future updates.
Keyboard shortcuts in ezQuake server browser
  • Network Throttling (NT): If ezQ is running on the same cores where network data is processed, sys_yieldcpu 0 will cause deviation.
    You can keep NT and sys_yieldcpu 0 if you exclude cpu0 (see ezQ launch section) and Receive Side Scaling (RSS) queue is set to 1.
    If you want RSS queue >1 then set sys_yieldcpu 1 or disable NT.
    Winkey+R > regedit > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile > NetworkThrottlingIndex = [10-70] range in decimal and default is 10 ; ffffffff in hexadecimal to disable.

  • Interrupt Moderation (IM): If you have a setting to define the rate, the higher the value the more delayed packets are.
    Some drivers have a buggy implementation. If you notice issues or want to be safe, disable in ethernet properties.


As an example, here are the settings tested with Xperf for the ethernet driver (ndis.sys). Values are shown in microseconds (usecs).
NT off causes more latency. IM rate is minimum. A good combination for these values is NT 70 + IM off or minimum.

DPC with Xperf

Network: packet loss

First, disable UDP checksum offload to see if it's a driver/ethernet bug. If it's not, turn it back on.
If you are experiencing packetloss, you can try to connect to a proxy. But if the problem is your own connection, this won't do anything.
In this situation it makes sense to duplicate (dupe) the network packets sent from and to the QuakeWorld server, so less packets are lost.
Dupe commands expect a numeric argument ([1-3] range). The numeric argument represents the number of duplicate packets.
The default is of course 0, representing 0 duplicated packets.

  • Console > setinfo dupe 1 (This tells the server to send to your client 1 duplicated packet). Set it in cl_onload alias for permanent use.
  • Console > cl_c2sdupe 1 (This tells your client to send to the server 1 duplicated packet). This is a client setting, so it is saved in your cfg file.


Note: Ensure you have at least /rate 50000. To duplicate packets will increase your bandwidth needs. In case your rate is not enough for the number of packets being received/sent, rate cut will happen.

The yellow lines on the netgraph represent rate cut. You can also see the absolute value, 18%

Performance: unstable FPS

If you feel like the game runs smooth for a while but you recognize small disturbing semi-periodic interrupts, those can be caused by background apps. Open Task Manager (ctrl+alt+del) and check whether some other processes are consuming cpu.

  • Start > Admin Tools > Event Viewer > Windows Logs: when you get an fps drop, check the time and see if there is a log that matches it.
  • Start > Admin Tools > Task Scheduler > Library: check for tasks from apps you installed that match the Event Viewer logs.
  • Uninstall or disable any RGB software (monitor; mouse; keyboard). It causes issues with the system.
  • Process Explorer can set low priority for I/O and memory of processes with the background priority, reducing the impact on the system.


Advanced Windows Settings

Do not change anything unless you know what you are doing!

  • Memory Compression: Although it's recommended there might be situations where de/compress causes latency. Your mileage may vary.
    Start > Windows PowerShell (as admin):
    > Get-MMAgent
    > Disable-MMAgent -mc
    > Enable-MMAgent -mc

  • Message Signaled Interrupts: Change supported devices to MSI. A negative value means it's working. Do not enable devices if the supported modes field doesn't include MSI. Windows sets interrupt priority of SATA to high. Leave the rest as undefined.

  • Telemetry: This doesn't cause performance issues but if you want to completely disable it, this method is safe and reversible.
    - Winkey+R > services.msc > Connected user experiences and telemetry > Disable (default auto)
    - Task Scheduler Library > Microsoft > Windows > Autochk / Customer Experience Improvement Program > Disable all tasks
    - HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows > New Key > DataCollection > New DWORD (32-bit) > AllowTelemetry = 0
    (Grays out the selectable options in Settings > Privacy > Diagnostics & feedback > Diagnostic data)


Other OS

Linux

See Smooth Quake in Linux

Mac

(to be added)

Finding help

Discord
Streaming
ezQuake documentation
Quakeworld.nu

Link to a previous version of this page now obsolete: Older Smooth Quake