Optimizing DLLs
January 2024
The Source SDK Visual Studios Projects properties and options are acceptable for many mods, but it can be made better and faster with some small changes to utilize Microsoft's optimizing C++ compiler. These changes produce code better tuned for newer processors without the need to re-write anything.
These changes are implemented by added extra switches and options to the property pages of your client and server projects. You can find this by selecting Project then Properties from the menu in the Visual C++ 2003 IDE.
Options
In the project properties page of your client and server, change these settings to optimize your DLL files.
Disable debugging
Set the compiler to use the release configuration instead of the debug configuration. This will apply several stock options. Most notably, it will define the NDEBUG macro instead of the DEBUG macro, allowing the preprocessor to remove various debugging aids, such as range checks and assertions, that consumes time.
Another thing this does is that it switches the runtime from the debugging version to the optimized release version.
Target modern CPUs
Code Generation -> Enable Enhanced Instruction Set - set to Advanced Vector Extensions 2 (/arch:AVX2)
The /arch compiler flag enables the SSE and AVX instruction set extensions of Intel and AMD processors. This determines your mod's REQUIRED CPU specs.
SSE (Streaming SIMD (Single Instruction, Multiple Data) Extensions) and AVX (Advanced Vector Extensions) allow the CPU to pack and modify large amounts of data at once, similarly to a GPU.
HOWEVER, Intel Celeron and Pentium CPUs have only supported AVX1 and AVX2 from 2021 onwards.
If you suspect your mod will be commonly played on extremely weak hardware such as this, consider Streaming SIMD Extensions 2 (/arch:SSE2).
Linker
- Optimization -> Enabled COMDAT Folding - set to Remove Redundant COMDATs (/OPT:ICF)
/OPT:ICF removes redundant COMDAT symbols from the linker output. - Optimization -> Optimize for Windows98 - set to No (/OPT:NOWIN98)
/OPT:NOWIN98 controls the section alignment in the final image. You should use this switch when building DLL's only for Windows NT, Windows 2000, Windows XP or later.
Whole Program Optimization / Link time code generation
- Whole Program Optimization - set to Yes.
Specifies that the program will be optimized across .obj boundaries.
Using whole program optimization means that each build will take longer, since the compiler effectively runs on all the files at the same time each build, but the compiler will on the other hand be able to optimize across compilation units, resulting in better performing output.
Profile guided optimization (PGO)
The compiler normally has to guess a lot about how the code will run as it compiles. By using PGO you run the program and capture actual usage statistics that you can feed back to the compiler, allowing it to know reality instead of having to guess. This can allow the compiler to drop hints for the CPU on what is likely and what is unlikely, letting the CPU use it's own optimizations more efficiently.
This is difficult to automatize, since it involves actually playing the game and ensuring that various parts of the code actually gets executed.