Optimizing DLLs

From Valve Developer Community
Revision as of 06:57, 18 July 2011 by Henke37 (talk | contribs) (More advice, fixing spelling and grouping WPO in one section)
Jump to navigation Jump to search

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.

Note.pngNote:Don't forget to add these options in both the client and hl properties.

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, that consumes time.

Whole Program Optimization / Link time code generation

  • Whole Program Optimization - set to Yes.
    Specifies that the program will be optimized across .obj boundaries.
    Note.pngNote:Memory requirements can be very high when compiling with Whole Program Optimization on
Note.pngNote:You should only need to use Whole Program Optimization if you built the vgui_controls.lib with the fixes.

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.

C/C++

  • Optimization -> Optimize for Processor - set to Pentium 4 and Above(/G7)
    The G7 flag produces code which is optimized for Pentium 4 processors and above which, in some cases can lead to a 10% improvement in execution speed. The code will still run on older processors, just not as fast.
  • Code Generation -> Enable Enhanced Instruction Set - set to Streaming SIMD Extensions (/arch:SSE)
    The arch flag enables the use of instructions found on processors that support enhanced instruction sets e.g., the SSE and SSE2 extensions of Intel 32-bit processors.
    Note.pngNote:Be careful with this setting as it will prevent the code running on processors which don't support these extensions

You can enable SSE (Streaming SIMD Extensions) optimizations due to the minimum requirements of HL2 being a 1.2 GHz CPU, that defaults to a Pentium 4 or AMD Athlon processor that supports this technology.

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.

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 is difficult to automatize, since it involves actually playing the game and ensuring that various parts of the code actually gets executed.

External links