There is no change in behaviour since we were using the C locale.
The locale-aware tolower is much slower than the locale-unaware one. At least on Linux/GCC it calls dynamic_cast's, and is overall slower by an order of magnitude.
Use pointers as map keys instead of string IDs. Resolves a nasty performance bottleneck on functions like hasCommonDisease() that previously had to look up all contained spells from the ESM store on every call. hasCommonDisease() is called hundreds of times per frame by the AI target update since it's used to calculate target disposition.
The total cost of hasCommonDisease() was 2.7% of the frame loop, now it's negligible.
ESM::Cell::getCellId() was allocating a string on every call. This caused functions dealing with cellIds to be unnecessarily expensive.
For example, World::moveObject spent almost as much time comparing CellIds as it did updating Bullet's AABB after the move. OpGetDistance was by far the most expensive script instruction because it has to compare cellIds.
The total cost of getCellId() relative to the frame loop was about 0.3%.
The cache size is specified with a min/max range, intended to avoid constant
unloading once the limit is reached. This way, buffers can be unloaded down to
a reasonable mimimum, allowing some more buffers to be subsequently loaded
without causing more unloading.
A deque allows existing Sound_Buffer references to remain valid as long as new
ones are back-inserted. These references can be used instead of indices.
the user settings.cfg file. Add a helpful header to the top of new
settings.cfg files. Remove old code involve whitespace management
that didn't work correctly anayway, and doesn't matter since we're not
adding comments to the file. Remove "automatically generated"
comments.
Settings::Manager code to do most of the work. Stop loading both the
global settings-default.cfg and the one in the current directory,
while continuing to prefer the latter one. Cleanup paths slightly and
remove what appears to have been debugging in the launcher settings.
Certain OpenAL implementations, including Rapture3D, Creative's hardware
drivers, and more recent versions of OpenAL Soft, can batch together changes so
that they all occur at once, avoiding potential discontinuities with one sound
being changed before another, or the listeenr being changed before sounds are.
On other implementaitons, this is a no-op and maintains existing behavior.