[RELz] Oblivion Stutter Remover (OSR)

Post » Tue Mar 08, 2011 8:42 pm

This is thread #10.
Thread #9 is http://www.gamesas.com/index.php?/topic/1140777-relz-oblivion-stutter-remover/
Thread #8 is http://www.gamesas.com/index.php?/topic/1074487-relzoblivion-stutter-remover/
Thread #7 is http://www.gamesas.com/bgsforums/index.php?showtopic=1068356
Thread #6 is http://www.gamesas.com/bgsforums/index.php?showtopic=1038949
Thread #5 is http://www.gamesas.com/bgsforums/index.php?showtopic=1029432
Thread #4 is http://www.gamesas.com/bgsforums/index.php?showtopic=987905
Thread #3 is http://www.gamesas.com/bgsforums/index.php?showtopic=979841
Thread #2 is http://www.gamesas.com/bgsforums/index.php?showtopic=968943
Thread #1 is http://www.gamesas.com/bgsforums/index.php?showtopic=965106

TESnexus page for Oblivion Stutter Remover: http://tesnexus.com/downloads/file.php?id=23208

The last full release version is 4.1.0. The full release versions get released with documentation, QA, packaging slightly friendlier to clueless installers, and a default ini for the latest version. That kind of thing. And source code is available for full releases, though it's a separate download. Stick to 4.1.0 if those things are important to you.
The Fallout 3 equivalent of 4.1.0 is 4.0.7... it's pretty much identical to 4.1.0 except for the version number. There is no Fallout New Vegas equivalent to 4.1.0.

The current version is 4.1.18 at the time I'm writing this, but there is a fair chance that by the time you read this there will be a later version. It should perform a little better than 4.1.0, but 4.1.0 was already pretty good. When I finish updating the documentation there will be a release named 4.2.0 with all the docs, QA, source, etc. The 4.1.18 and later packages are labeled "Tripple WIP" because the same package includes equivalents for Oblivion, Fallout 3, and Fallout New Vegas. Ignore the non-Oblivion variants if you don't have FO3 or FNV.

readme for OSR version 4.1.0, in spoiler tags so you don't have to scroll so far if it's not what you're looking for:
Spoiler
Oblivion Stutter Remover
version 4.1.0
by SkyRanger-1

Forum thread: http://www.gamesas.com/bgsforums/index.php?showtopic=1068356
TESnexus page: http://tesnexus.com/downloads/file.php?id=23208

This is an OBSE plugin, and it will not work without a recent version of OBSE.


====================================
0. Contents:
====================================

0. Contents
1. Overview
2. Installing
3. Uninstalling
4. Common Settings Changes
5. All Settings
6. Version History
7. How This Works
8. Credits


====================================
1. Overview:
====================================

This plugin makes Oblivion not "stutter" as much, and generally feel smoother or perform better. It prevents or mitigates a number of issues related to stuttering and framerates, and can reduce the frequency of stutter related crashes. For more detail, see Section 7: How This Works.

Note however that this is not a substitute for Silent Feet / PyFFI / Oblivion Crash Prevention System / etc. For instance if you get major stuttering because of sound driver or sound hardware issues, this might help but Silent Feet would be likely to help more.

This is compatible with everything except earlier versions of itself. The only caveat is that Streamline (and other mods that monitor FPS) will not be able to accurately measure FPSes outside of the target range set by this plugin (10 to 30 by default). In fact, even FPSes that merely come close to OSR targets may be difficult to measure. In general, there should be at least a 10% margin between any FPS that you want a mod like Streamline to be able to measure and the OSR target. i.e. If OSR FPS targets are 10 to 30, then Streamline FPS min should be at least 11 and Streamline FPS max should be at most 27.


====================================
2. Installing:
====================================

The installation process is:

1.A. If the version of OSR you are installing came as a .zip file, simply drag the "Data" folder from the zip to your Oblivion folder.

1.B. If the version of OSR you are installing did NOT come as a .zip file then you need to place the file sr_Oblivion_Stutter_Remover.dll in to your Oblivion\Data\obse\plugins folder. If you don't have such a folder, create it. If you had an older version of OSR installed, delete its ini file (Data\obse\plugins\sr_Oblivion_Stutter_Remover.ini). If there is no existing OSR ini file then OSR will generate a new ini file with settings appropriate for your version the next time you run Oblivion.

2. [Optional] Customize your OSR settings by adjusting the OSR ini file. For settings you might want to adjust, see section 4. The OSR ini file is Data\obse\plugins\sr_Oblivion_Stutter_Remover.ini


====================================
3. Uninstalling:
====================================

Simply delete the sr_Oblivion_Stutter_Remover.dll file from your Data\obse\plugins folder.
Moving that file to another directory would also be sufficient.


====================================
4. Common Settings Changes
====================================

In general, OSR attempts to have decent default settings so that users are not required to monkey with them. However, there are a few settings where the default values might not be appropriate for you, either because the default values do not match your tastes or because OSR is makes incorrect assumptions about your computer.

OSR keeps its settings in the file Data\obse\plugins\sr_Oblivion_Stutter_Remover.ini
If that file is not present, simply launch Oblivion with OSR installed and OSR will generate a new one with default settings for your version of OSR. If you have screwed something up in your settings or otherwise want to revert to default settings, simply delete this ini file and launch Oblivion.

You can find general information about settings in section 5, as well as more complete information on each individual setting.

The settings you are most likely to want to change are:

Master\bReplaceHeap: (defaults to 0, consider changing to 1)
This is still off by default because some people experience instability with it. Turning on heap replacement does improvement performance though. The amount it improves performance by depends upon how much multithreading your copy of Oblivion tries to do - if it tries to do a lot of multithreading then this setting can produce really huge improvements. This also helps with some serious performance issues that arise in longer game sessions when playing a heavily modded game on Oblivion on Windows XP. If you have trouble with Master\bReplaceHeap turned on then you might try different heap algorithms by changing Heap\iHeapAlgorithm, which should usually be either 1, 5, or 3.

FPS_Management\MaximumFPS: (defaults to 30, consider changing to 0 or other values)
Some people don't want their framerate limited at all. You can turn off FPS limiting by setting this to 0. Also, if your screen refresh rate when playing Oblivion is not 60 Hertz, you might try changing this to your screen refresh rate, or half your screen refresh rate, or one third your screen refresh rate. This setting will have no effect if Master\bManageFPS is changed to 0.

Hashtables\bAllowDynamicResizing: (defaults to 0, consider changing to 1)
Turning this on can improve general performance / FPS significantly on heavily modded games. Unfortunately, it may cause race conditions and general mayhem, particularly when scripts using certain OBSE commands are running every frame. I've attempted to reduce the chance of problems to near zero, but... it may require more work yet. Meantime this feature defaults to disabled. This setting will have no effect if Master\bHookHashtables is changed to 0.

Critical Section Suppression: (special)
By default OSR suppresses one particular critical section that Oblivion seems to work better without. There is another related critical section which some users seem to be able to suppress without causing problems, but other users experience CTDs on interior->exterior transitions or other problems when its suppressed. That one only produces a small improvement to stuttering, so I don't normally recommend suppressing it, but you can if you want to. To suppress it, find the line that says "CallerAddress = 0x70172A" in your ini file and add a new line right after it that says "Mode = 5". Note that case is important there... it should be "Mode" and not "mode". This setting will have no effect if Master\bHookCriticalSections or CriticalSections\bUseOverrides are set to 0.


====================================
5. All Settings
====================================

OSR keeps its settings in the file Data\obse\plugins\sr_Oblivion_Stutter_Remover.ini
If that file is not present, simply launch Oblivion with OSR installed and OSR will generate a new one with default settings for your version of OSR. If you have screwed something up in your settings or otherwise want to revert to default settings, simply delete this ini file and launch Oblivion.

Note that the format of OSR ini files changes between major versions of OSR - you should not use an OSR version 3 ini file with OSR version 4, etc. In OSR4, the ini file is organized in to sections like "SectionName { SettingName = Value }". A specific setting may be refered to as SectionName\SettingName to distinguish it from other settings with the same name in different sections. In general settings with names that begin with an "i" are integer values (ie a number with no decimal point), setting with names that begin with a "b" are boolean values (ie either 0 or 1), and settings that begin with an "f" are numbers which may have decimal points in them (ie 3.14). Some settings do not begin with one of those letters, in which case it may not be clear what the proper type of values are.

These are the settings and their current default values (may not be 100% up to date):

Section: Master{}
This section contains an option to disable each major subsystem of OSR, plus a few settings for things that don't belong to any particular subsystem of OSR.

Master\bManageFPS (default: 1)
Setting this to 0 will disable all FPS management stuff, making every setting in the FPS_Management section meaningless.

Master\bHookCriticalSections (default: 1)
Setting this to 0 will disable all Critical Section stuff, making every setting in the CriticalSections section meaningless.

Master\bHookHashtables (default: 1)
Setting this to 0 will disable all Hashtable stuff, making every setting in the CriticalSections section meaningless.

Master\bReplaceHeap (default: 0)
Setting this to 1 will enable heap replacement, making the settings in the Heap section meaningful.

Master\bLogToConsole (default: 0)
OSR logs various bits of information to its log file. Changing this setting to 1 will cause OSR to also print that information to the console.
The log file is sr_Oblivion_Stutter_Remover.log in the Oblivion directory. It is created or overwritten each time Oblivion runs with OSR installed.

Master\bFix64Hertz (default: 1)
Setting this to 1 fixes a problem in Oblivion that causes "microstutter". This problem is sometimes known as the "64 Hertz issue". Specifically the issue is that Oblivion game logic timing normally occurs at a resolution of 1/64th of a second, and screen refresh rates normally permit Oblivion to draw 60 frames per second when vsync limited. This combination creates a kind of beat frequency when the framerate is maxed out in which 4 frames each second have twice the amount of game time pass as the other 56 frames. The fix that OSR applies forces Oblivion to use time at a resolution of 1/1000th of a second instead of 1/64th of a second.

Master\bFlushLog (default: 1)
This tells OSR to write any log messages to its file immediately instead of buffering them in memory. It can reduce performance slightly due to larger number of disk accesses, but it makes it more likely that any messsages pertaining to problems that occur shortly before a crash will successfully get written to the log file.

Master\iSchedulingResolution (default: 1)
OSR will request that the Windows scheduler run at a resolution of this many milliseconds. With this set at 1, OSR and Oblivion generally work better. This can slightly reduce the battery life of laptops however.

Section: FPS_Management{}
This section contains settings that adjust how OSR manages your framerate and the flow of game time.

FPS_Management\bAllowSlowMotion (default: 1)
Setting this to 0 will prevent OSR from attempting to override the normal flow of game time. In the past bugs have arison from OSR doing so (most infamously, the nearby-NPCs-drop-dead-on-cell-transitions bug), but these are believed to be fixed now. Just in case you suspect there might be an issue though, you can forcibly disable all OSR game time adjustments with this setting. Despite the name, setting this to 0 will also prevent OSR from fast-forwarding game time, though OSR only tries to do that under very rare combinations of settings and circumstances.

FPS_Management\MaximumFPS (default: 30)
This is a maximum FPS that OSR will not permit Oblivion to exceed. I generally set this to a framerate high enough that I won't really care much about any extra frames per second. Note that OSR does not really deal with "frames per second" here, it converts that value to a milliseconds-per-frame number instead, and considers each frame individually. If a frame would be finished too quickly then OSR will cause Oblivions main thread to go to sleep until the correct number of milliseconds have passed. Putting Oblivions main thread to sleep can free up resources for use by Oblivions background threads or for other programs that may be running in the background. If nothing wants to use the extra resources then your CPU and/or GPU will run colder and use less electricity.

FPS_Management\MinimumFPS (default: 10)
This is a minimum FPS that OSR will not permit Oblivion to go under. However, instead of dealing with real seconds, this deals with seconds of game time. So you can still have an FPS of 1 if your computer is really slow, but this would slow down game time to 10% of normal so that there will always be at least 10 frames per second of game time. All the numbers there were just for example, based upon a real FPS of 1 and a MinimumFPS setting of 10 (the default value). Also note that like MaximumFPS this actually works on a single-frame basis dealing with millisecond per frame instead of frames per second.
I generally set this to the lower FPS that I find remotely playable. The big purpose of this setting is to prevent Oblivions game logic from going berserk when the FPS gets too low. Issues that this prevents include fights that are impossible because enemies can run circles around you between frames, screwed up controls because Oblivion thinks that the attack key is down for an entire frame or not down for an entire frame which may cause a power attack to occur when an attack was intended, and lots of other similar issues.

FPS_Management\iSmoothFrames (default: 0)
If this is set to 0, the "smoothing" logic doesn't do anything. To turn on the smoothing logic try setting this to 2. However, reports suggest that the smoothing logic isn't really worth much of anything. The smoothing logic is intended to prevent a variety of issues that arise from stutters and other rapid changes in framerates. The smoothing logic will have no effect if bAllowSlowMotion is 0.

FPS_Management\iSmoothMode (default: 0)
This should be 0, 1, 2, or 3. If it's 0 or 1 then it will enable some extra logic that tries to filter stutter events out of the flow of time. That logic can end up with the total amount of gametime that passes not being quite equal to the amount of real time that passes if there was a very sudden drop in FPS. If it's 2 or 3 then that extra bit of logic is disabled. The difference betteen 0/2 and 1/3 is a very subtle issue of which frames get time redistributed between them how.

FPS_Management\iSleepExtra (default: 2)
OSR will force Oblivion to sleep for this many milliseconds every second. This can help free up resources for background threads or other processes, or reduce the temperature & power consumption of computer components slightly. The main benefit is that if some background thread is struggling to get a particular resource that the main thread is hogging, this can give it a chance to get ahold of that resource once in a while.
If this is set to -1 then the OSR FPS management code will never put Oblivion to sleep - if the FPS would otherwise exceed MaximumFPS then OSR will waste time in an idle loop. That mode is not recommended as is provided for testing purposes only.

FPS_Management\bFPSConsoleSPAM (default: 0)
This will cause OSR to log the amount of time it takes to complete each frame. It will do so once per frame, creating an enormous amount of logged times.

FPS_Management\iSchedulingParanoia (default: 1)
This setting is in units of milliseconds. It determines how paranoid the MaximumFPS code is about the scheduler. If the value is high, then the MaximumFPS code will never sleep, instead wasting time in idle loops. If the value is 0, then the MaximumFPS code will trust the scheduler to resume the main threads execution at exactly the requested time. Generally I compromise at 1 for a modicrum of paranoia about the scheduler but still allowing much of the spare time to be put to constructive use.

FPS_Management\iHardMaxFrametime (default: 200)
This is in units of milliseconds. It's been found that when my time flow adjusting code puts in a time that's too large at the wrong time, strange things happen. Bad things. Like, nearby NPCs randomly dropping dead. This setting prevents that, by setting an absolute maximum to the number of milliseconds OSR permits to pass at once in the normal course of things. Normally you'll hit MinimumFPS before you hit this limit, but MinimumFPS gets waived under some circumstances to prevent side effects like lip movements desynching with voices, so this acts a sort of 2nd level of MinimumFPS, the I-really-mean-it minimum FPS. Setting this too low can cause things like lip movements desynching in conversations, setting it too high can permit bugs like NPCs-dropping-dead-randomly. I set 200 as a compromise - it should not cause lips to desynch unless your framerate drops to less than 5 in a conversation. And if you are playing Oblivion at a framerate of less than 5 then you need serious help.

Section: CriticalSections{}
This section deals with all the changes that OSR makes to Oblivions CRITICAL_SECTIONs. Want to know about CRITICAL_SECTION objects? Oblivion uses them to prevent its various threads from accidentally killing each other. Microsoft provides the code for them. Oblivion uses slightly different versions of them depending upon which version of Windows it runs on. You can read more about them on MSDN.

CriticalSections\bEnableProfiling (default: 0)
If set to 1 then OSR will record information about the timing / performance of critical section operations in Oblivion. Doing so cause a small but significant penalty to performance. OSR will record the information in its log file. This can potentially produce useful information about why your Oblivion is stuttering or running slowly. That info might be used to adjust the Overrides section of the OSR ini file or something.

CriticalSections\bEnableMessages (default: 0)
If set to 1 then OSR will record information about some timing / performance events of critical sections. There is very little performance cost to doing so, but it can clutter up the log file making it harder to find non-critical-section information in there.

CriticalSections\bUseOverrides (default: 1)
If this is set to 1 then OSR will use the settings in the Overrides section of the ini to determine what is should do to specific critical sections.

CriticalSections\iDefaultMode (default: 2)
This determines what OSR does to critical sections that don't have a Mode entry for them in the Overrides list.
1: it leaves that critical section at aproximately normal behavior.
2: it adjusts that critical section to improve fairness at the cost of throughput. This can prevent one thread from hogging a critical section too much, but can net rate at which operations can be done with that critical section.
3: an attempted compromise between fairness and throughput in which it usually optimizes for throughput but once in a while switches behavior to optimize for fairness.
5: that critical section is suppressed. Suppressing critical sections generally causes Oblivion to crash, but also generally improves performance. Certain critical sections may be affected differently though.
6: that the main thread gets priority for that critical section.
7: that background threads get priority for that critical section.

CriticalSections\iDefaultSpin (default: 1000)
This effects how long a thread will keep trying to enter a critical section before asking the scheduler to put it to sleep until that critical section becomes available. In theory a value that is too small will result in too much scheduler overhead, while a value that is too large will result in wasted CPU cycles. 1000 is actually a kinda small value I think. The ideal value may increase with the number of cores / hardware threads you have.

CriticalSections\iStutterLevel (default: 4)
This parameter effecst how often critical section mode 2 switches behavior. See iDefaultMode for more about critical section mode 2. A smaller number means frequent switches, a larger number means infrequent switches. The ideal value should probably be somewhere in the range of 3 to 6.

Section: Heap{}
The vanilla Oblivion heap is really really bad at dealing with multithreaded workloads. It also has a tendency to suddenly and dramatically slow down after long game sessions in heavily modded games. OSR can replace the vanilla Oblivion heap with a different heap to fix these issues.

Heap\iHeapAlgorithm (default: 5)
This chooses which heap OSR will force Oblivion to use.
1: FastMM4 heap. This requires BorlndMM.dll to be present in Data\obse\plugis\ComponentDLLs, otherwise it will prevent Oblivion from starting up. This heap is fast and flexible.
2: Windows standard heap. OS dependant. A really bad idea on XP, but okay on Vista and Windows 7.
3: A heap I wrote titled SimpleHeap1. It's reasonably fast.
4: Don't use this one.
5: A heap I wrote titled ThreadHeap2. It's reasonably fast.

Heap\bEnableProfiling (default: 0)
If this is set to 1 then OSR will measure the performance of the heap it provides and record it to the log. This can't measure the performance of the vanilla heap, only the performance of OSR-provided heaps.

Heap\iHeapSize (default: 450)
This only effects heap algorithms #3 and #5 (see iHeapAlgorithm above) - the other heaps choose their own size and dynamically resize themselves. It is the number of megabytes that the heap reserves for dynamically allocated objects in Oblivion.

Heap\bEnableMessages (default: 0)
If this is set to 1 then the OSR heap code may occaisonally record a little information to the log.

Section: Hashtables{}
Oblivion includes a bunch of hashtables for looking up all sorts of things. They use a generally horrid hashtable implementation, but the real problem is they never resize their hashtables and the default sizes they use are targetted at an unmodded game and often rather small even for that. When a hashtable gets overful, performance drops. If a hashtable is underful then a tiny bit of memory may be wasted, and cache coherency may drop. Unfortunately, much of the hashtable code is inlined all over the place, and OBSE makes various assumptions about the hashtables as well, and its not at all clear to me what the relevant threading model is supposed to be, so changing them safely is quite difficult. Still, I have some hashtable hooks, and they're gradually getting better.

Hashtables\bAllowDynamicResizing (default: 0)
If this is set to 1 then OSR will increase the size of hashtables once they get overful. The act of resizing them is fraught with problems however - it can cause crashes or glitches, and the methods I use to prevent it from doing so can cause small performance stutters or other crashes or glitches. Still, at this point I think it might be working kinda decently.

Hashtables\bUseOverrides (default: 0)
Currently there are no hashtable overrides, and the syntax for specifying them is awkward and has the potential to silently fail and do something else instead if you enter the wrong value. This will get fixed up eventually though to allow ini-file-specified hooks in to the initialization of the most important hashtables to make them start out at a decent size instead of needing to be resized later.

Hashtables\bEnableProfiling (default: 0)
This will monitor hashtables and log information about how full they are and how much they get accessed.

Hashtables\bEnableMessages (default: 0)
If this is 1 then the hashtables code may occasionally log messages about what it is doing.

Hashtables\iHashtableResizeScale1 (default: 2)
Hashtables\iHashtableResizeScale2 (default: 4)
If bAllowDynamicResizing is 1 then iHashtableResizeScale1 will determine the minimum level of occupancy at which a hashtable will be resized, and iHashtableResizeScale2 will determine how much larger its new size will be. Both numbers are actually exponents applied to 2, so a setting of 3 means a factor of 8, and a setting of 5 means a factor of 32. In theory reducing iHashtableResizeScale1 down to 1 might improve performance more, because it would increase the size of more hashtables. iHashtableResizeScale2 should probably be set to 1 or 2 more than iHashtableResizeScale1.

Hashtables\iHashtableResizeDelay (default: 20)
This is a number of milliseconds that OSR will stall for when resizing a hashtable. The idea is that while I can't prevent another thread from accessing the hashtable while I'm busy with it, I can, hopefully, prevent them from *starting* to access the hashtable. So I delay long enough that maybe, possibly, anyone who was already accessing the hashtable will finish up, then I do my stuff. That doesn't work on OBSE unfortunately because OBSE doesn't do the same things as Oblivion does, plus even when it does it doesn't use the vtables to do them. But atm I'm thinking that OBSE may only access them from the main thread, so if my resizer runs in the main thread then it doesn't have to worry about OBSE. Maybe.

Section: Overrides{}
This section contains information telling OSR how to find specific instances various types of objects that OSR knows about, and ways to treat those specific instances differently than the default settings for that type of object. Currently only things that actually get listed here are a few specific critical sections with different behaviors than most.


====================================
6. Version History:
====================================

version 1:
This was known as FPS Capper. All it did was FPS management.

version 2:
This was known as FPS Capper. All it did was FPS management.

version 3 beta 1:
The first version to be named Oblivion Stutter Remover. Sometimes freezes for several minutes at the main menu. NPC voice and face movements can screw up in dialogue.
version 3 beta 2: NPC voice and face movements can screw up in dialogue.

version 3 beta 3: NPC face movements can screw up in dialogue, but not nearly as bad as in beta 2.

version 3 beta 4:
Don't use this version! In some cases nearby NPCs would randomly die whenever you did a cell transition.
version 3 beta 5:
Reports of very rare drastic FPS drops, fixable by restarting Oblivion.

version 3 beta 6:
There was a long delay between beta 5 and beta 6, filled by many alpha releases. This was the first version of OSR to really do a decent job of actually reducing stutter for the average user. This is because of new features: critical section fairness tweaks, critical section suppression, and heap replacement. Unfortunately, heap replacement still has major problems for many users. bFix64Hertz was set to 0 by default in the ini, it should be 1 instead.

note: there was never a version 3 final. If there's enough demand I could make one up based off of version 3 beta 6 source code with a few fixes.

Version 4.1.0:
Major Changes:
Fallout 3 support: Doesn't provide as much benefit on Fallout 3, but it does help. See Fallout Stutter Remover.
.ini file: Completely different ini file format
Hashtable resizing: New feature for improving performance
Critical Sections: Generalized many special cases for critical sections, now much more adjustable from the ini file.
Heap Replacement: Fixed a few bugs, but I think it still has problems.
Version naming: Versions released to tesnexus are now called release versions instead of beta versions. Versions released to my ftp server are now called beta versions instead of alpha versions. The first digit of the version number ("4" in this case) is incremented only when major changes are made to configuration or distribution format. The 2nd digit of the version number ("1" in this case) is incremented each release version. The 3rd digit of the version number is incremented once for each beta version. Whenever a digit is incremented, all digits further to the right are reset to 0.

====================================
7. How This Works:
====================================

This is an OBSE plugin dll. It basically hacks Oblivion.

7.1: FPS Management:
The FPS management code monitors framerates and adjusts the flow of gametime. It mitigates stuttering by making Oblivion game logic not skip ahead when it does stutter. Effectively, frames that take a long time end up being in slow motion. This is done by making Oblivion act as if iFPSClamp were set to MinimumFPS, but only for frames that are slower than MinimumFPS. This may also improve stability. It can also impose a maximum framerate - some people perceive Oblivion as smoother when its framerate is prevented from exceeding half the refresh rate, plus this helps free up resources for Oblivions secondary threads.

The FPS management code can also puts the main thread of Oblivion to sleep for brief periods of time, which has been oberved to improve stutter for some people (though that functionality may have been made redundant by other things this plugin does).

7.2: Critical Sections:
Critical sections are microsoft-provided thread synchronization primitives that Oblivion uses internally to make sure that threads don't accidentally corrupt each other. OSR by default makes most critical sections attempt to play fair even at the cost of throughput, making sure that no thread hogs a resource that other threads need. However, one specific critical section is overriden to use a slightly less fair method, and another specific critical section is suppressed so that it has no effect at all. And that's all very configurable from the ini file. Also the spincounts get overriden.

7.3: Heap Replacement:
Oblivion uses a custom heap (aka memory manager aka malloc/free) implementation that appears to have been written by Bethesda specifically for Oblivion. Their implementation is flawed. Specifically, it performs really badly on multithreaded workloads, which Oblivion often is. This plugin now has the ability to replace the Oblivion heap manager with a variety of alternatives, most of which are MUCH faster on multithreaded workloads. Unfortunately, changing the heap implementation seems to cause Oblivion to become unstable for some users. I'm not certain if this is due to a flaw in my method of replacing the heap, or if this is due to bugs in Oblivion that happen to not crash with Oblivions vanilla heap.

The performance improvement offered by this is large (reduces stutter, reduces load times, makes certain menus faster, may improve FPS slightly) for many people, though some peoples installs of Oblivion seem to not multithread as much. Unfortunately, because it has a tendency to produce instability I have set this feature to default to disabled for the time being. However, given the large performance boost that many people see with this, I would suggest that users try turning this on, only turning it back off if they experience stability issues that seem to be related.

7.4: Hashtables:
Oblivion includes a bunch of hashtables for looking up all sorts of things. They use a poor hashtable implementation, but the real problem is they never resize their hashtables and the default sizes they use are targetted at an unmodded game and often rather small even for that. When a hashtable gets overful, performance drops. If a hashtable is underful then a tiny bit of memory may be wasted. Unfortunately, much of the hashtable code is inlined all over the place, and OBSE makes various assumptions about the hashtables as well, and its not at all clear to me what the relevant threading model is supposed to be, so changing them safely is quite difficult.

Still, I have some hashtable hooks, and they're gradually getting better. OSR can increase the size of hashtables once they get overful. The act of resizing them is fraught with problems however - it can cause crashes or glitches, and the methods I use to prevent it from doing so can cause small performance stutters or other crashes or glitches. Still, at this point I think it might be working kinda decently. In the future I may replace this or suplement this with overriding the initial sizes of certain hashtables.


====================================
8. Credits:
====================================

This plugin was made by me (Christopher Doty-Humphrey).

It would not have been possible without the enormous efforts made by the OBSE team. In addition, Ian Patterson (an OBSE team guy) has helped me through a lot of spots where I had trouble.

The original thread that prompted me to start this plugin was started by DeviusCreed.

Numerous testers have supplied useful feedback. In particular mashani's information about which settings produced which results for him helped me understand why early versions of this were producing unexpected benefits, and led to a number of the features and settings in later versions.

I would also like to thank badhair for pointing me at overfull hashtables as a cause of performance problems.

The following tools were used in the production of this plugin:
Oblivion, by Bethesda
OBSE and the OBSE source code
Microsoft Visual C++ 2008 Express Edition
IDA Free (Interactive Debugger, free version, version 4.9)
Cheat Engine (version 5.4)
Plus the obvious stuff like Windows XP, Notepad, and Firefox.

With the exception of Oblivion and Windows XP, all of those are available free of charge.

I've also had Hex Workshop and ollydbg recommended to me but haven't gotten around to trying them yet.


Section 4 of the docs for 4.1.0 briefly describes OSR ini changes that users might want to make, and section 5 describes the massive amounts of ini changes that are possible.
But that's for 4.1.0. What if you're using a recent Work-In-Progress version and want to customize your OSR ini? Here is an update for the OSR ini tweaks worth considering:
1. The heap replacement considerations remain largely the same as described in 4.1.0 - heap replacement helps performance a lot (if your Oblivion.ini is at default settings anyway), but often requires some tweaking to get it stable, and sometimes can't be made stable at all. The reasons are unknown.
There is however some additional notes here:
1A. If you are on a 64 bit version of Windows, strongly consider patching Oblivion.exe to enable LAA (aka 4 GB mode).
1B. If you have Heap/iHeapAlgorithm set to 5 or 3, consider increasing Heap/iHeapSize to a larger value. Many people report that 1000 works much better for them than smaller values. This is especially true if you have LAA enabled (see 1A above).
1C. Avoid the Experimental/bAlternateHeapHooks option.
2. MaximumFPS and MinimumFPS remain the same as discussed in the 4.1.0 documentation. Adjust them to your taste.
3. Renderer+0x80 remains the same. Change it to mode 5 to improve stutter slightly, but it may create instability.
4. Hashtables/bAllowDynamicResizing is no longer recommended even for people will to trade a little stability for a little extra performance. OSR now gets some of the same benefits by a much safer method (hashtable overrides), so enabling this no longer provides as much improvement as it used to.
5. If you enable Master/bExperimentalStuff, that will make the settings in the Experimental take effect. The setting Experimental/bReplaceRawRandom defaults to 1, and it will improve Oblivions performance slightly (and I believe 100% safely... it should get moved out of the experimental section some time). The setting Experimental/bReplaceExtraRandom will also improve performance a tiny bit, but it has some very subtle side effects on game balance. If you have 3 or more CPU cores then setting Experimental/iThreadsFixedToCPUs and Experimental/iReduceLongSleep each to 1 *might* help. Maybe.
User avatar
stevie critchley
 
Posts: 3404
Joined: Sat Oct 28, 2006 4:36 pm

Post » Tue Mar 08, 2011 10:14 pm

I tried what you recommended, adding 0x80000000 to iHeapMainBlockAddress. My save game won't load with that set. Just thought you should know.

It's not expected to work w/o a 64 bit OS or /3GB. And it's sounding like it doesn't work even then without LAA. Oh well. It may still be useful for figuring out it the location of the heap block effects stability or not.

With bAlternateHeapHooks = 1 Oblivion won't even launch for me. It's an instant CTD just after the small launch console appears.

This is on a 2GB laptop with XP SP3. Let me know if you need more details. Thanks!

bAlternateHeapHooks is not ready for prime time. It does have the advantage of being supported (marginally) on FNV, where the old hooks are not atm. And of running on my computer on FO3, where the old hooks tend to crash right away. But it's not recommended under any circumstances in the current version.

Same here. I even used cut-and-paste from this thread to insure that the right value got added to the ini. (I'm notorious for goofing up anything to do with numbers.) That said, once I switched iHeapMainBlockAddress back to "0" v4.1.18 worked well for me. I had a two-hour-plus session with it and nary a belch.

Glad to here that lower-is-better for the FPS readout. My numbers would be scary otherwise, as this sampling shows:

(snip)
System: Intel i7-930 @ 2.8ghz, 6gb DDR3-1600 ram, nVidia GTX470 1.2gb GPU, Soundblaster X-fi with an Oblivion profile in Alchemy, Windows 7-64bit, Oblivion.exe LAA flag enabled, Screen resolution 1280x1024.

Some systems get better FPSes than others. Mine aren't actually to far from there, but only because I play at a fairly low resolution w/o AA.

Thanks for clarifying, that means that my testing method was - as I suspected - not quite ideal. A better method would probably be to travel on a specific path in the exterior environment, starting from the same spot/savegame every time and measuring frametimes. But in the end it probably won't matter that much, as you mentioned that my case where both algorithms seem to work is rather rare anyway.

As I also run a 64bit OS, I did a quick test with the new version. Setting iHeapMainBlockAddress to 0x80000000, heap algorithm 5 and disabling LAA on the exe results in Oblivion not even loading for me. OBSE starts, but after that nothing happens. The log looks like this:
MemoryHeap Optimization Mode 5: attempting to completely replace their custom heap manager with my ThreadHeap2ThreadHeap2::init - VirtualAlloc: 00000000 7fffffff 28A00000ERROR:ERROR: ThreadHeap2::init - main block allocation failed, shutting down


With LAA enabled, Oblivion crashes after about half a minute.

Sounds like MS won't let me use address space outside of the normal range w/o LAA even if I explicitly request it. Oh well.
User avatar
danni Marchant
 
Posts: 3420
Joined: Sat Oct 07, 2006 2:32 am

Post » Wed Mar 09, 2011 12:31 pm

0X80000000=12 digits...?
User avatar
Len swann
 
Posts: 3466
Joined: Mon Jun 18, 2007 5:02 pm

Post » Wed Mar 09, 2011 1:29 am

The "0x" at the start aren't treated as digits, they're a prefix that indicates that the digits afterwards are in hexadecimal (0-9,A-F) instead of the default decimal (0-9). 32 bit addresses are generally represented as 8 digit hexadecimal addresses (4 bits per hexadecimal digit * 8 hexadecimal digits = 32 bits). In some cases the leading zeroes are dropped from some addresses (ie 0xB32B80 vs 0x00B32B80).
User avatar
victoria johnstone
 
Posts: 3424
Joined: Sat Oct 14, 2006 9:56 am

Post » Wed Mar 09, 2011 2:09 am

It's not expected to work w/o a 64 bit OS or /3GB. And it's sounding like it doesn't work even then without LAA. Oh well. It may still be useful for figuring out it the location of the heap block effects stability or not.


I have a 64 bit OS. Windows 7 x64. I have 4GB of memory. I do have the LAA flag enabled. I don't want to disable it, even for testing. Too much of a hassle even for a minute. Gotta rename my backup, rename the enabled executable...

I have some questions about certain settings:

What does "iReduceLongSleep", "bRemoveShortSleep", "bSuppressRandomSeeding", and "iPrintSceneGraphDepth" do? I may enable those things to see what happens. I must say, I don't know if you entended this or not, but the experimental stuff improves stability for me. I played for an hour without a crash. That hasn't happened since I was running less than 40 mods. Years.
User avatar
lucile
 
Posts: 3371
Joined: Thu Mar 22, 2007 4:37 pm

Post » Wed Mar 09, 2011 9:49 am

These 3 aren't really intended to help performance so much as just experiment:
bRemoveShortSleep suppresses all Sleep(0) calls. Not very interesting on Oblivion I think, but could be interesting on FO3 due to how it uses Sleep(0) in some of their thread synchronization primitives there.
iPrintSceneGraphDepth is only for testing. Okay, really, it's only for kicks. It prints out the scene graph to the log file. Once per frame. To a maximum depth equal to the integer value. So if you set it to like 99 or something you'll get several kilobytes of text dumped to the log file every frame. And it will be full of grass nodes, triangle strips, etc.
bSuppressRandomSeeding is likewise only for testing. It prevents Oblivion from re-seeding its random number generators. Which ought to screw with any part of Oblivion that uses RNGs as procedural generators for some purposes. Though I haven't seen much effect. In older versions, due to a bug in OSR, this accidentally suppressed all random number generation calls instead, which did have a visible effect.

iReduceLongSleep might actually help performance. If you have 2 cores or less, leave it at 0. At 3+ cores, a setting of 1 here might, conceivably help. A tiny bit. It reduces the duration of all Sleep calls that Oblivion makes. Setting it to 1 reduces them to 50%, 2 to 25%, 3 to 12.5%, etc. Note that if this reduces a Sleep duration to 0 milliseconds, that Sleep(0) will NOT be suppressed by bRemoveShortSleep.
User avatar
mollypop
 
Posts: 3420
Joined: Fri Jan 05, 2007 1:47 am

Post » Wed Mar 09, 2011 11:28 am

These 3 aren't really intended to help performance so much as just experiment:
bRemoveShortSleep suppresses all Sleep(0) calls. Not very interesting on Oblivion I think, but could be interesting on FO3 due to how it uses Sleep(0) in some of their thread synchronization primitives there.
iPrintSceneGraphDepth is only for testing. Okay, really, it's only for kicks. It prints out the scene graph to the log file. Once per frame. To a maximum depth equal to the integer value. So if you set it to like 99 or something you'll get several kilobytes of text dumped to the log file every frame. And it will be full of grass nodes, triangle strips, etc.
bSuppressRandomSeeding is likewise only for testing. It prevents Oblivion from re-seeding its random number generators. Which ought to screw with any part of Oblivion that uses RNGs as procedural generators for some purposes. Though I haven't seen much effect. In older versions, due to a bug in OSR, this accidentally suppressed all random number generation calls instead, which did have a visible effect.

iReduceLongSleep might actually help performance. If you have 2 cores or less, leave it at 0. At 3+ cores, a setting of 1 here might, conceivably help. A tiny bit. It reduces the duration of all Sleep calls that Oblivion makes. Setting it to 1 reduces them to 50%, 2 to 25%, 3 to 12.5%, etc. Note that if this reduces a Sleep duration to 0 milliseconds, that Sleep(0) will NOT be suppressed by bRemoveShortSleep.


Thanks. Okay, so if I have iReduceLongSleep enabled, that effectively disables the effect of bRemoveShortSleep?
User avatar
Amanda Furtado
 
Posts: 3454
Joined: Fri Dec 15, 2006 4:22 pm

Post » Wed Mar 09, 2011 2:24 am

"Setting it to 1 reduces them to 50%, 2 to 25%, 3 to 12.5%, etc. Note that if this reduces a Sleep duration to 0 milliseconds, that Sleep(0) will NOT be suppressed by bRemoveShortSleep."

Note the progression: 1=50%...3=12.5%, then 4=0%, which =Sleep duration to 0 milliseconds. I think.
User avatar
Juanita Hernandez
 
Posts: 3269
Joined: Sat Jan 06, 2007 10:36 am

Post » Wed Mar 09, 2011 2:56 am

bRemoveShortSleep works fine with iReduceLongSleep. It's just that there is an ambiguity to the described behavior there - if Oblivion code does a Sleep(3), and iReduceLongSleep reduces that 3 to a 0, does bRemoveShortSleep then completely suppress the call? No, bRemoveShortSleep only suppresses calls that were originally 0, not those that are modified to 0 by iReduceLongSleep.
User avatar
Emily abigail Villarreal
 
Posts: 3433
Joined: Mon Aug 27, 2007 9:38 am

Post » Wed Mar 09, 2011 8:23 am

"Setting it to 1 reduces them to 50%, 2 to 25%, 3 to 12.5%, etc. Note that if this reduces a Sleep duration to 0 milliseconds, that Sleep(0) will NOT be suppressed by bRemoveShortSleep."
Note the progression: 1=50%...3=12.5%, then 4=0%, which =Sleep duration to 0 milliseconds. I think.


bRemoveShortSleep works fine with iReduceLongSleep. It's just that there is an ambiguity to the described behavior there - if Oblivion code does a Sleep(3), and iReduceLongSleep reduces that 3 to a 0, does bRemoveShortSleep then completely suppress the call? No, bRemoveShortSleep only suppresses calls that were originally 0, not those that are modified to 0 by iReduceLongSleep.


I'll enable it. See if it helps any.
User avatar
Samantha hulme
 
Posts: 3373
Joined: Wed Jun 21, 2006 4:22 pm

Post » Wed Mar 09, 2011 5:43 am

ThreadHeap2 @ 1000 no FixedCPU or reduce/supress sleep enabled gets me tightest avg @ 40-63. Seems to render newly loading textures faster with experimental bReplaceRaw and ExtraRandom both enabled.
User avatar
Your Mum
 
Posts: 3434
Joined: Sun Jun 25, 2006 6:23 pm

Post » Wed Mar 09, 2011 6:57 am

ThreadHeap2 @ 1000 no FixedCPU or reduce/supress sleep enabled gets me tightest avg @ 40-63. Seems to render newly loading textures faster with experimental bReplaceRaw and ExtraRandom both enabled.


I can't even load my save with ThreadHeap2 enabled. I wish I could to try and test to see if it helps more than the others. Right now I'm using SimpleHeap1. That's given me the best, most stable results of the heaps I've tried. I haven't tried the Microsoft heap yet, though.

iThreadsFixedToCPUs improves stability for me. I will definitely keep that enabled.
User avatar
Barbequtie
 
Posts: 3410
Joined: Mon Jun 19, 2006 11:34 pm

Post » Tue Mar 08, 2011 11:01 pm

@Skyranger-1,
sorry no good news: enabling Experimental and setting the iHeapMainBlockAddress = 0x80000000 as you wanted, would not start the game at all. It will break off immediately. Simply resetting Experimental to 0, and the game will start normally again. That was *WITH* the oblivion.exe still LAA-enabled on my rig with 6GB of RAM and Win7 x64. :no:
User avatar
Gill Mackin
 
Posts: 3384
Joined: Sat Dec 16, 2006 9:58 pm

Post » Wed Mar 09, 2011 10:35 am

It didn't like iHeapMainBlockAddress = 0x80000000 even with LAA? Something else must have grabbed address space in that region. Dunno what's going on there.
User avatar
Destinyscharm
 
Posts: 3404
Joined: Sun Jul 23, 2006 6:06 pm

Post » Wed Mar 09, 2011 11:58 am

Hey... that alternate BorlandMM.dll someone was linking a bit ago... does it actually improve performance any? No one has had any problems with it?
Also, does anyone know if BorlandMM.dll has a function for getting the size of allocated memory block from a pointer at it, as in the equivalent of microsofts _msize()? Or if there's a fast way to query it whether or not a block of memory lies within its heap?
User avatar
Matt Gammond
 
Posts: 3410
Joined: Mon Jul 02, 2007 2:38 pm

Post » Tue Mar 08, 2011 10:28 pm

Hey... that alternate BorlandMM.dll someone was linking a bit ago... does it actually improve performance any? No one has had any problems with it?
Also, does anyone know if BorlandMM.dll has a function for getting the size of allocated memory block from a pointer at it, as in the equivalent of microsofts _msize()? Or if there's a fast way to query it whether or not a block of memory lies within its heap?


I'm using the latest BorlandMM file. I didn't notice any improvements when I was using that heap replacement over the one you include in 4.1.
User avatar
Carolyne Bolt
 
Posts: 3401
Joined: Mon Jul 10, 2006 4:56 am

Post » Wed Mar 09, 2011 7:05 am

Hey... that alternate BorlandMM.dll someone was linking a bit ago... does it actually improve performance any? No one has had any problems with it?
Also, does anyone know if BorlandMM.dll has a function for getting the size of allocated memory block from a pointer at it, as in the equivalent of microsofts _msize()? Or if there's a fast way to query it whether or not a block of memory lies within its heap?



Perhaps you will find some answers in the sourcecode (GetMemoryManagerState?)
http://fastmm.svn.sourceforge.net/viewvc/fastmm/FastMM4.pas?revision=29&view=markup
User avatar
Mark Churchman
 
Posts: 3363
Joined: Sun Aug 05, 2007 5:58 am

Post » Tue Mar 08, 2011 11:46 pm

I'm using the latest BorlandMM file. I didn't notice any improvements when I was using that heap replacement over the one you include in 4.1.

Probably no need to update to that one then.

Perhaps you will find some answers in the sourcecode (GetMemoryManagerState?)
http://fastmm.svn.sourceforge.net/viewvc/fastmm/FastMM4.pas?revision=29&view=markup

http://fastmm.svn.sourceforge.net/viewvc/fastmm/Replacement%20BorlndMM%20DLL/CB2007/BorlndMM.pas?revision=1&view=markup
Thanks. There appears to be no equivalent to _msize(), nor an is_in_heap type function.
User avatar
steve brewin
 
Posts: 3411
Joined: Thu Jun 21, 2007 7:17 am

Post » Tue Mar 08, 2011 8:51 pm

It didn't like iHeapMainBlockAddress = 0x80000000 even with LAA? Something else must have grabbed address space in that region. Dunno what's going on there.


Same here. Using that setting with LAA results in an immediate CTD once it begins loading the mods.

Problem signature:  Problem Event Name:	BEX  Application Name:	Oblivion.exe  Application Version:	1.2.0.416  Application Timestamp:	462392c7  Fault Module Name:	StackHash_e98d  Fault Module Version:	0.0.0.0  Fault Module Timestamp:	00000000  Exception Offset:	00000000  Exception Code:	c0000005  Exception Data:	00000008  OS Version:	6.1.7600.2.0.0.768.3  Locale ID:	1033  Additional Information 1:	e98d  Additional Information 2:	e98dfca8bcf81bc1740adb135579ad53  Additional Information 3:	6eab  Additional Information 4:	6eabdd9e0dc94904be3b39a1c0583635

User avatar
Rowena
 
Posts: 3471
Joined: Sun Nov 05, 2006 11:40 am

Post » Wed Mar 09, 2011 10:19 am

Just for kicks...I chopped up my Oblivion.exe with CFF and LAA a copy. All heaps work. Enabled bAlternateHeapHooks with iHeapMainBlockAddress = 0x80000000, ThreadHeap5. Ran around IC, interior exterior and then did two arena fights. Average times down to 33, high as 77. Just so you know, it works on my 32bit system...or at least doesn't CTD.

And the FastMM (v4.97) IS an improvement over XP/Vanilla/no replacement.

SR-this link help? : http://www.zachsaw.co.cc/?pg=borlndmm_tbbmm
User avatar
Toby Green
 
Posts: 3365
Joined: Sun May 27, 2007 5:27 pm

Post » Wed Mar 09, 2011 10:27 am

moto: I'm a bit dubious of that article. For starters, his test case considers only the simplest scenario in which every item freed is the most recent item malloced by the same thread, and all mallocs are the same size. Also he considers only 2 cores. I have no clue how good or bad the TBBMM he compares it to is. This is what I see in comparable benchmarks on the heaps in OSR on comparable hardware:
alg 5: my ThreadHeap2
1: 61.86 ns
2: 72.41 ns
4: 146.81 ns
8: 248.26 ns
alg 3: my SimpleHeap1
1: 108.16 ns
2: 224.82 ns
4: 457.37 ns
8: 963.80 ns
alg 2: windows XP
1: 113.29 ns
2: 222.26 ns
4: 428.32 ns
8: 777.71 ns
alg 1: FastMM4
1: 44.93 ns
2: 96.59 ns
4: 181.70 ns
8: 353.17 ns

By that standard SimpleHeap1 is worse than the XP heap, and FastMM4 is compared to my ThreadHeap2 looks about like how it compares to TBBMM in his article. Real world programs almost always have more complex allocation patterns than that.
If you add even a tiny bit of complexity, say, scrambling the order of the mallocs and frees but still having every thread only free mallocs made by the same thread, you get:
alg 5: my ThreadHeap2
1: 90.96 ns
2: 110.72 ns
4: 249.35 ns
8: 367.17 ns
alg 3: my SimpleHeap1
1: 124.37 ns
2: 276.96 ns
4: 553.69 ns
8: 1186.69 ms
alg 2: Windows XP
1: 117.32 ns
2: 276.45 ns
4: 560.89 ns
8: 1161.34 ns
alg 1: FastMM4
1: 41.99 ns
2: 97.77 ns
4: 172.95 ns
8: 343.88 ns

Suddenly FastMM4 looks pretty good compared to my ThreadHeap2. And SimpleHeap1 looks comparable to XPs heap.
Many real world programs are that simple. Many (like Oblivion) are not. If we switch to a workload in which blocks malloced by one thread can be freed by another thread like in Oblivion... I don't care to spend the time atm to write a synthetic benchmark of that complexity or rerun my Oblivion benchmarks, but testing it in Oblivion saw results on the rough order of this on my computer IIRC:
ThreadHeap2: 150 ns
SimpleHeap1: 190 ns
Windows XP: 1800+ ns!!!
FastMM4: 120 ns

Overall FastMM4 ends up looking pretty damned awesome, and XPs heap looks broken.
User avatar
suzan
 
Posts: 3329
Joined: Mon Jul 17, 2006 5:32 pm

Post » Wed Mar 09, 2011 9:16 am

In my long game (over 400 hrs), I'm having terrible stutter when riding Shadowmere or fighting. I was using ThreadHeap2 and the stutter was so bad riding the horse that the game kept freezing periodically. I had to let my finger off the key for a good 5 seconds to let the game catch up. Then it would catch up and I could continue. I had the HeapSize set to 450, but I wasn't seeing anything in the log that indicated that that wasn't big enough. I've switched to FastMM4 and it's doing better. Still stuttering but no 5 second freezes.

I'm running Win 7 64 with 8 GB RAM on a Q9650 @ 3.0 GHz. Quad core, no HT. I've applied the LAA patch to Oblivion. Any ideas on how I might reduce the stutter a bit more? I did try the experimental settings you suggested earlier when I was using ThreadHeap2 and I think that was even worse.
User avatar
Strawberry
 
Posts: 3446
Joined: Thu Jul 05, 2007 11:08 am

Post » Wed Mar 09, 2011 10:23 am

I originally posted something enormous but mostly wrong in regards to testing some reproducible errors out:

OK, what I thought was all OSR's fault is now just partially OSR's fault. I was combining two issues into being the fault of OSR, while I still have the other issue, but it didn't actually show up in my multiple tests until I figured out how to trigger it. I'm apparently still doing something wrong on my end with that error, I just deleted all that information from this post so it will remain a mystery unless it's already being replied to. :tongue:

Basically I have a save file that I can load, where at the beginning of the game (I have been using a dungeon skipping mod), fast travelling to the market will result in a crash with OSR on. If I start from scratch in this test with OSR on, I can't even Streamsave.

If I try the same thing all over again without OSR, I can Streamsave and I can fast travel.

I have a vanilla Oblivion, save for OBSE plugins. OBSE, OBGEv2, OSR, FastExit 2, Streamline (only use Streamsave and Streampurge). I have 4 physical cores, 8 logical. LAA-patched and 64-bit, I have 12GB of RAM. Here is my INI:

Spoiler
Master = {	_comment = You can turn on or off each distinct feature from here.	bManageFPS = 1	bHookCriticalSections = 1	bHookHashtables = 1	bReplaceHeap = 1	bLogToConsole = 0	bFix64Hertz = 1	bFlushLog = 1	iSchedulingResolution = 1	bExtraProfiling = 0	bExperimentalStuff = 1	iMainHookPoint = 1}Experimental = {	iReduceLongSleep = 2	bRemoveShortSleep = 0	iThreadsFixedToCPUs = 4	bReplaceRawRandom = 1	bSuppressRandomSeeding = 0	bMonitorBSShaderAccumulator = 0	iPrintSceneGraphDepth = 0	bReplaceExtraRandom = 1}FPS_Management = {	_comment = Basic FPS stuff, switches to slow-motion on low FPS; in the past this has occaisonally produced bugs like the NPCs-dropping-dead issue; the issues are believed to be fixed but if you suspect you are having related problems you can try disabling bAllowSlowMotion which is the main suspect for any problems relating to FPS management	bAllowSlowMotion = 1	MaximumFPS = 30	MinimumFPS = 10	iSmoothFrames = 0	iSmoothMode = 0	iSleepExtra = 2	iFPS_Frequency = 4000	iSchedulingParanoia = 1	iHardMaxFrametime = 200}CriticalSections = {	_comment = CS stuff helps both Oblivion and Fallout significantly	_comment = most of the benefit comes from the Renderer+0x180 suppression (see overrides below)	_comment = modes: 1=vanilla, 2=fair, 3=staggering, 5=suppressed, 6=prioritize-main-thread, 7=deprioritize-main-thread	bEnableProfiling = 0	bEnableMessages = 1	bUseOverrides = 1	iDefaultMode = 3	iDefaultSpin = 1000	iStaggerLevel = 5}Heap = {	_comment = Heap replacement can produce MAJOR improvements in performance on Oblivion at a significant cost in stability	_comment = It crashes instantly on Fallout3, and would only produce a small performance improvement there anyway	_comment = It is not supported at all on Fallout: New Vegas at this time	_comment = Algorithms: 1=FastMM4 (requires external dll), 2=Microsoft (slow on XP), 3=SimpleHeap1, 5=ThreadHeap2	iHeapAlgorithm = 5	bEnableProfiling = 0	iHeapSize = 1024	bEnableMessages = 0	iGenericFreeDelay = 0}Hashtables = {	_comment = The dynamic resizing option is buggy and not recommended.  	bAllowDynamicResizing = 0	bUseOverrides = 1	bEnableProfiling = 0	bEnableMessages = 1	bEnableExtraMessages = 0	iHashtableResizeScale1 = 2	iHashtableResizeScale2 = 4	iHashtableResizeDelay = 20}OverrideList = {	CriticalSection = {		CallerAddress = 0x701748		comment = Renderer+0x180, recommendation=suppress (mode 5)		Mode = 5	}	CriticalSection = {		ObjectAddress = 0xB32B80		comment = MemoryHeap CS, recommendation=stagger (mode 3)		Mode = 3		Spin = 1500	}	CriticalSection = {		CallerAddress = 0x70172A		comment = Renderer+0x80, recommendation=???	}	CriticalSection = {		ObjectAddress = 0xB3FA00		comment = Unknown4, recommendation=???	}	CriticalSection = {		ObjectAddress = 0xB33800		comment = BaseExtraList, recommendation=3		Mode = 3		Spin = 1500	}	Hashtable = {		comment =caller 0x00418E16		SizeAddress = 0x00418DDB		OldSize = 37		NewSize = 149	}	Hashtable = {		comment =caller 0x0045a8a1		SizeAddress = 0x0045A866		OldSize = 5039		NewSize = 133123	}	Hashtable = {		comment =caller 0x004A25BC		SizeAddress = 0x004A2586		OldSize = 523		NewSize = 2711	}	Hashtable = {		comment =multipart 1/2 - caller 0x004e614f		SizeAddress = 0x004E610F		OldSize = 37		NewSize = 47	}	Hashtable = {		comment =multipart 2/2 - caller 0x004e614f		SizeAddress = 0x004E612C		OldSize = 37		NewSize = 47	}	Hashtable = {		comment =caller 0x004E9014		SizeAddress = 0x004E8FD7		OldSize = 37		NewSize = 739	}	Hashtable = {		comment =caller 0x004f0e20		SizeAddress = 0x004F1B44		OldSize = 37		NewSize = 127		WordBits = 8	}	Hashtable = {		comment =caller 0x004f1d60		SizeAddress = 0x004F220A		OldSize = 7001		NewSize = 7001	}	Hashtable = {		comment =also caller 0x004f1d60		SizeAddress = 0x004F222E		OldSize = 701		NewSize = 901	}	Hashtable = {		comment =also caller 0x004f1d60		SizeAddress = 0x004F2B70		OldSize = 37		NewSize = 127		WordBits = 8	}	Hashtable = {		comment =multipart 1/2 - caller 0x004F2ACB		SizeAddress = 0x004F2A8B		OldSize = 37		NewSize = 713	}	Hashtable = {		comment =multipart 2/2 - caller 0x004F2ACB		SizeAddress = 0x004F2AA8		OldSize = 37		NewSize = 713	}	Hashtable = {		comment =multipart 1/2 - caller 0x004f2b3e		SizeAddress = 0x004F2AEF		OldSize = 37		NewSize = 1301	}	Hashtable = {		comment =multipart 2/2 - caller 0x004f2b3e		SizeAddress = 0x004F2B12		OldSize = 37		NewSize = 1301	}	Hashtable = {		comment =caller 0x0067fbb0		SizeAddress = 0x006C5396		OldSize = 37		NewSize = 83	}	Hashtable = {		comment =also caller 0x0067fbb0		SizeAddress = 0x0067FD35		OldSize = 191		NewSize = 3019	}	Hashtable = {		comment =also caller 0x0067fbb0		SizeAddress = 0x0067FE5F		OldSize = 191		NewSize = 2021	}	Hashtable = {		comment =caller 0x006C56B0		SizeAddress = 0x006C5674		OldSize = 37		NewSize = 299	}	Hashtable = {		comment =caller 0x00714788		SizeAddress = 0x00714752		OldSize = 59		NewSize = 239	}	Hashtable = {		comment =many callers: 0x00769C3D, 0x00769CAD, 0x00769D03, 0x00769D53, 0x00769DA1		SizeAddress = 0x00769BEB		OldSize = 37		NewSize = 297	}	Hashtable = {		comment =multipart 1/2 - caller 0x009dbf36		SizeAddress = 0x009DBF03		OldSize = 131213		NewSize = 905671	}	Hashtable = {		comment =multipart 2/2 - caller 0x009dbf36		SizeAddress = 0x00B06140		OldSize = 131213		NewSize = 905671	}	Hashtable = {		comment =caller 0x009e2726		SizeAddress = 0x009E26F3		OldSize = 37		NewSize = 297	}	Hashtable = {		comment =caller 0x00a10de6		SizeAddress = 0x00A10DB3		OldSize = 37		NewSize = 297	}}


I am still on 4.1.16. I have been too busy troubleshooting my issues..

So basically the original point of my huge post and all the test results was, this save I have where I can reproduce a crash with OSR on consistently, would I be able to use it to test what setting(s) in the INI file make these things happen? Or is turning on/off OSR on an existing save unscientific?
User avatar
BaNK.RoLL
 
Posts: 3451
Joined: Sun Nov 18, 2007 3:55 pm

Post » Wed Mar 09, 2011 9:08 am

In my long game (over 400 hrs), I'm having terrible stutter when riding Shadowmere or fighting. I was using ThreadHeap2 and the stutter was so bad riding the horse that the game kept freezing periodically. I had to let my finger off the key for a good 5 seconds to let the game catch up. Then it would catch up and I could continue. I had the HeapSize set to 450, but I wasn't seeing anything in the log that indicated that that wasn't big enough. I've switched to FastMM4 and it's doing better. Still stuttering but no 5 second freezes.

I'm running Win 7 64 with 8 GB RAM on a Q9650 @ 3.0 GHz. Quad core, no HT. I've applied the LAA patch to Oblivion. Any ideas on how I might reduce the stutter a bit more? I did try the experimental settings you suggested earlier when I was using ThreadHeap2 and I think that was even worse.

I don't think I've ever actually gotten far enough in the DB questline to see or ride shadowmere. I'm assuming this is a very fast horse? If you're using LOD mods and have not tried reducing your uGridsDistantCount or whatever you might try that. But generally OSR already does a lot to improve the stutter that accompanies high speed exterior travel. Shadowmere has some graphic effects IIRC, but you implied that it gets better when you take your hand off the keyboard for a few seconds though, so it sounds like an exterior travel issue not a graphics issue though.

I've heard a few reports of stuttering in large fights (particularly against NPCs, not monsters) but have not seen it myself (well, I've seen low FPS on fights when using bad graphics cards, but I don't think that's what you're talking about). I don't really know anything about any code likely to be involved in that. If you send me a log of a session with lots of this stutter with CS profiling enabled and maybe Master/bExtraProfiling too I might be able to... well, I probably couldn't do anything. If there happened to be a CS involved in a big way I might be able to suggest a tweak or two. If there was something particularly interesting showing up in the ExtraProfiling data I might be able to get a hint what code was involved. It would help if I could produce such problems locally.

Oh, and did you change OSR ini settings? Particularly the CriticalSections stuff, the critical section overrides, and iThreadsFixedToCPUs? If you have iThreadsFixedToCPUs set to a higher value, try lowering it to 1 or 0. Probably 0. If you changed CriticalSections/iDefaultMode to say 6 or 1 or something, try changing it back to 2.

I originally posted something enormous but mostly wrong in regards to testing some reproducible errors out:

OK, what I thought was all OSR's fault is now just partially OSR's fault. I was combining two issues into being the fault of OSR, while I still have the other issue, but it didn't actually show up in my multiple tests until I figured out how to trigger it. I'm apparently still doing something wrong on my end with that error, I just deleted all that information from this post so it will remain a mystery unless it's already being replied to. :tongue:

Basically I have a save file that I can load, where at the beginning of the game (I have been using a dungeon skipping mod), fast travelling to the market will result in a crash with OSR on. If I start from scratch in this test with OSR on, I can't even Streamsave.

If I try the same thing all over again without OSR, I can Streamsave and I can fast travel.

I have a vanilla Oblivion, save for OBSE plugins. OBSE, OBGEv2, OSR, FastExit 2, Streamline (only use Streamsave and Streampurge). I have 4 physical cores, 8 logical. LAA-patched and 64-bit, I have 12GB of RAM. Here is my INI:

Spoiler
Master = {	_comment = You can turn on or off each distinct feature from here.	bManageFPS = 1	bHookCriticalSections = 1	bHookHashtables = 1	bReplaceHeap = 1	bLogToConsole = 0	bFix64Hertz = 1	bFlushLog = 1	iSchedulingResolution = 1	bExtraProfiling = 0	bExperimentalStuff = 1	iMainHookPoint = 1}Experimental = {	iReduceLongSleep = 2	bRemoveShortSleep = 0	iThreadsFixedToCPUs = 4	bReplaceRawRandom = 1	bSuppressRandomSeeding = 0	bMonitorBSShaderAccumulator = 0	iPrintSceneGraphDepth = 0	bReplaceExtraRandom = 1}FPS_Management = {	_comment = Basic FPS stuff, switches to slow-motion on low FPS; in the past this has occaisonally produced bugs like the NPCs-dropping-dead issue; the issues are believed to be fixed but if you suspect you are having related problems you can try disabling bAllowSlowMotion which is the main suspect for any problems relating to FPS management	bAllowSlowMotion = 1	MaximumFPS = 30	MinimumFPS = 10	iSmoothFrames = 0	iSmoothMode = 0	iSleepExtra = 2	iFPS_Frequency = 4000	iSchedulingParanoia = 1	iHardMaxFrametime = 200}CriticalSections = {	_comment = CS stuff helps both Oblivion and Fallout significantly	_comment = most of the benefit comes from the Renderer+0x180 suppression (see overrides below)	_comment = modes: 1=vanilla, 2=fair, 3=staggering, 5=suppressed, 6=prioritize-main-thread, 7=deprioritize-main-thread	bEnableProfiling = 0	bEnableMessages = 1	bUseOverrides = 1	iDefaultMode = 3	iDefaultSpin = 1000	iStaggerLevel = 5}Heap = {	_comment = Heap replacement can produce MAJOR improvements in performance on Oblivion at a significant cost in stability	_comment = It crashes instantly on Fallout3, and would only produce a small performance improvement there anyway	_comment = It is not supported at all on Fallout: New Vegas at this time	_comment = Algorithms: 1=FastMM4 (requires external dll), 2=Microsoft (slow on XP), 3=SimpleHeap1, 5=ThreadHeap2	iHeapAlgorithm = 5	bEnableProfiling = 0	iHeapSize = 1024	bEnableMessages = 0	iGenericFreeDelay = 0}Hashtables = {	_comment = The dynamic resizing option is buggy and not recommended.  	bAllowDynamicResizing = 0	bUseOverrides = 1	bEnableProfiling = 0	bEnableMessages = 1	bEnableExtraMessages = 0	iHashtableResizeScale1 = 2	iHashtableResizeScale2 = 4	iHashtableResizeDelay = 20}OverrideList = {	CriticalSection = {		CallerAddress = 0x701748		comment = Renderer+0x180, recommendation=suppress (mode 5)		Mode = 5	}	CriticalSection = {		ObjectAddress = 0xB32B80		comment = MemoryHeap CS, recommendation=stagger (mode 3)		Mode = 3		Spin = 1500	}	CriticalSection = {		CallerAddress = 0x70172A		comment = Renderer+0x80, recommendation=???	}	CriticalSection = {		ObjectAddress = 0xB3FA00		comment = Unknown4, recommendation=???	}	CriticalSection = {		ObjectAddress = 0xB33800		comment = BaseExtraList, recommendation=3		Mode = 3		Spin = 1500	}	Hashtable = {		comment =caller 0x00418E16		SizeAddress = 0x00418DDB		OldSize = 37		NewSize = 149	}	Hashtable = {		comment =caller 0x0045a8a1		SizeAddress = 0x0045A866		OldSize = 5039		NewSize = 133123	}	Hashtable = {		comment =caller 0x004A25BC		SizeAddress = 0x004A2586		OldSize = 523		NewSize = 2711	}	Hashtable = {		comment =multipart 1/2 - caller 0x004e614f		SizeAddress = 0x004E610F		OldSize = 37		NewSize = 47	}	Hashtable = {		comment =multipart 2/2 - caller 0x004e614f		SizeAddress = 0x004E612C		OldSize = 37		NewSize = 47	}	Hashtable = {		comment =caller 0x004E9014		SizeAddress = 0x004E8FD7		OldSize = 37		NewSize = 739	}	Hashtable = {		comment =caller 0x004f0e20		SizeAddress = 0x004F1B44		OldSize = 37		NewSize = 127		WordBits = 8	}	Hashtable = {		comment =caller 0x004f1d60		SizeAddress = 0x004F220A		OldSize = 7001		NewSize = 7001	}	Hashtable = {		comment =also caller 0x004f1d60		SizeAddress = 0x004F222E		OldSize = 701		NewSize = 901	}	Hashtable = {		comment =also caller 0x004f1d60		SizeAddress = 0x004F2B70		OldSize = 37		NewSize = 127		WordBits = 8	}	Hashtable = {		comment =multipart 1/2 - caller 0x004F2ACB		SizeAddress = 0x004F2A8B		OldSize = 37		NewSize = 713	}	Hashtable = {		comment =multipart 2/2 - caller 0x004F2ACB		SizeAddress = 0x004F2AA8		OldSize = 37		NewSize = 713	}	Hashtable = {		comment =multipart 1/2 - caller 0x004f2b3e		SizeAddress = 0x004F2AEF		OldSize = 37		NewSize = 1301	}	Hashtable = {		comment =multipart 2/2 - caller 0x004f2b3e		SizeAddress = 0x004F2B12		OldSize = 37		NewSize = 1301	}	Hashtable = {		comment =caller 0x0067fbb0		SizeAddress = 0x006C5396		OldSize = 37		NewSize = 83	}	Hashtable = {		comment =also caller 0x0067fbb0		SizeAddress = 0x0067FD35		OldSize = 191		NewSize = 3019	}	Hashtable = {		comment =also caller 0x0067fbb0		SizeAddress = 0x0067FE5F		OldSize = 191		NewSize = 2021	}	Hashtable = {		comment =caller 0x006C56B0		SizeAddress = 0x006C5674		OldSize = 37		NewSize = 299	}	Hashtable = {		comment =caller 0x00714788		SizeAddress = 0x00714752		OldSize = 59		NewSize = 239	}	Hashtable = {		comment =many callers: 0x00769C3D, 0x00769CAD, 0x00769D03, 0x00769D53, 0x00769DA1		SizeAddress = 0x00769BEB		OldSize = 37		NewSize = 297	}	Hashtable = {		comment =multipart 1/2 - caller 0x009dbf36		SizeAddress = 0x009DBF03		OldSize = 131213		NewSize = 905671	}	Hashtable = {		comment =multipart 2/2 - caller 0x009dbf36		SizeAddress = 0x00B06140		OldSize = 131213		NewSize = 905671	}	Hashtable = {		comment =caller 0x009e2726		SizeAddress = 0x009E26F3		OldSize = 37		NewSize = 297	}	Hashtable = {		comment =caller 0x00a10de6		SizeAddress = 0x00A10DB3		OldSize = 37		NewSize = 297	}}


I am still on 4.1.16. I have been too busy troubleshooting my issues..

So basically the original point of my huge post and all the test results was, this save I have where I can reproduce a crash with OSR on consistently, would I be able to use it to test what setting(s) in the INI file make these things happen? Or is turning on/off OSR on an existing save unscientific?

Generally turning OSR on/off for an existing save is fine testing methodology. In theory there might be exceptions to that, but I don't think I've ever seen or heard of one.
The first thing to try turning off are heap replacement, iThreadsFixedToCPUs, and iReduceLongSleep. After that... well, the Master section is intended to make it easy to turn off major subsystems of OSR easily and methodically.
User avatar
Theodore Walling
 
Posts: 3420
Joined: Sat Jun 02, 2007 12:48 pm

Post » Wed Mar 09, 2011 9:09 am

Generally turning OSR on/off for an existing save is fine testing methodology. In theory there might be exceptions to that, but I don't think I've ever seen or heard of one.
The first thing to try turning off are heap replacement, iThreadsFixedToCPUs, and iReduceLongSleep. After that... well, the Master section is intended to make it easy to turn off major subsystems of OSR easily and methodically.


With INI like this:

Spoiler
Master = {
_comment = You can turn on or off each distinct feature from here.
bManageFPS = 1
bHookCriticalSections = 1
bHookHashtables = 1
bReplaceHeap = 1
bLogToConsole = 0
bFix64Hertz = 1
bFlushLog = 1
iSchedulingResolution = 1
bExtraProfiling = 0
bExperimentalStuff = 1
iMainHookPoint = 1
}
Experimental = {
iReduceLongSleep = 2
bRemoveShortSleep = 0
iThreadsFixedToCPUs = 4
bReplaceRawRandom = 1
bSuppressRandomSeeding = 0
bMonitorBSShaderAccumulator = 0
iPrintSceneGraphDepth = 0
bReplaceExtraRandom = 1
bAlternateHeapHooks = 0
iHeapMainBlockAddress = 0
}
FPS_Management = {
_comment = Basic FPS stuff, switches to slow-motion on low FPS; in the past this has occaisonally produced bugs like the

NPCs-dropping-dead issue; the issues are believed to be fixed but if you suspect you are having related problems you can try

disabling bAllowSlowMotion which is the main suspect for any problems relating to FPS management
bAllowSlowMotion = 1
MaximumFPS = 30
MinimumFPS = 10
iSmoothFrames = 0
iSmoothMode = 0
iSleepExtra = 2
iFPS_Frequency = 4000
iSchedulingParanoia = 1
iHardMaxFrametime = 200
}
CriticalSections = {
_comment = CS stuff helps both Oblivion and Fallout significantly
_comment = most of the benefit comes from the Renderer+0x180 suppression (see overrides below)
_comment = modes: 1=vanilla, 2=fair, 3=staggering, 5=suppressed, 6=prioritize-main-thread, 7=deprioritize-main-thread
bEnableProfiling = 0
bEnableMessages = 1
bUseOverrides = 1
iDefaultMode = 3
iDefaultSpin = 1000
iStaggerLevel = 5
}
Heap = {
_comment = Heap replacement can produce MAJOR improvements in performance on Oblivion at a significant cost in stability
_comment = It crashes instantly on Fallout3, and would only produce a small performance improvement there anyway
_comment = It is not supported at all on Fallout: New Vegas at this time
_comment = Algorithms: 1=FastMM4 (requires external dll), 2=Microsoft (slow on XP), 3=SimpleHeap1, 5=ThreadHeap2
iHeapAlgorithm = 5
bEnableProfiling = 0
iHeapSize = 650
bEnableMessages = 0
iGenericFreeDelay = 0
}
Hashtables = {
_comment = The dynamic resizing option is buggy and not recommended.
bAllowDynamicResizing = 0
bUseOverrides = 1
bEnableProfiling = 0
bEnableMessages = 1
bEnableExtraMessages = 0
iHashtableResizeScale1 = 2
iHashtableResizeScale2 = 4
iHashtableResizeDelay = 20
}
OverrideList = {
CriticalSection = {
CallerAddress = 0x701748
comment = Renderer+0x180, recommendation=suppress (mode 5)
Mode = 5
}
CriticalSection = {
ObjectAddress = 0xB32B80
comment = MemoryHeap CS, recommendation=stagger (mode 3)
Mode = 3
Spin = 1500
}
CriticalSection = {
CallerAddress = 0x70172A
comment = Renderer+0x80, recommendation=???
}
CriticalSection = {
ObjectAddress = 0xB3FA00
comment = Unknown4, recommendation=???
}
CriticalSection = {
ObjectAddress = 0xB33800
comment = BaseExtraList, recommendation=3
Mode = 3
Spin = 1500
}
Hashtable = {
comment =caller 0x00418E16
SizeAddress = 0x00418DDB
OldSize = 37
NewSize = 149
}
Hashtable = {
comment =caller 0x0045a8a1
SizeAddress = 0x0045A866
OldSize = 5039
NewSize = 133123
}
Hashtable = {
comment =caller 0x004A25BC
SizeAddress = 0x004A2586
OldSize = 523
NewSize = 2711
}
Hashtable = {
comment =multipart 1/2 - caller 0x004e614f
SizeAddress = 0x004E610F
OldSize = 37
NewSize = 47
}
Hashtable = {
comment =multipart 2/2 - caller 0x004e614f
SizeAddress = 0x004E612C
OldSize = 37
NewSize = 47
}
Hashtable = {
comment =caller 0x004E9014
SizeAddress = 0x004E8FD7
OldSize = 37
NewSize = 739
}
Hashtable = {
comment =caller 0x004f0e20
SizeAddress = 0x004F1B44
OldSize = 37
NewSize = 127
WordBits = 8
}
Hashtable = {
comment =caller 0x004f1d60
SizeAddress = 0x004F220A
OldSize = 7001
NewSize = 7001
}
Hashtable = {
comment =also caller 0x004f1d60
SizeAddress = 0x004F222E
OldSize = 701
NewSize = 901
}
Hashtable = {
comment =also caller 0x004f1d60
SizeAddress = 0x004F2B70
OldSize = 37
NewSize = 127
WordBits = 8
}
Hashtable = {
comment =multipart 1/2 - caller 0x004F2ACB
SizeAddress = 0x004F2A8B
OldSize = 37
NewSize = 713
}
Hashtable = {
comment =multipart 2/2 - caller 0x004F2ACB
SizeAddress = 0x004F2AA8
OldSize = 37
NewSize = 713
}
Hashtable = {
comment =multipart 1/2 - caller 0x004f2b3e
SizeAddress = 0x004F2AEF
OldSize = 37
NewSize = 1301
}
Hashtable = {
comment =multipart 2/2 - caller 0x004f2b3e
SizeAddress = 0x004F2B12
OldSize = 37
NewSize = 1301
}
Hashtable = {
comment =caller 0x0067fbb0
SizeAddress = 0x006C5396
OldSize = 37
NewSize = 83
}
Hashtable = {
comment =also caller 0x0067fbb0
SizeAddress = 0x0067FD35
OldSize = 191
NewSize = 3019
}
Hashtable = {
comment =also caller 0x0067fbb0
SizeAddress = 0x0067FE5F
OldSize = 191
NewSize = 2021
}
Hashtable = {
comment =caller 0x006C56B0
SizeAddress = 0x006C5674
OldSize = 37
NewSize = 299
}
Hashtable = {
comment =caller 0x00714788
SizeAddress = 0x00714752
OldSize = 59
NewSize = 239
}
Hashtable = {
comment =many callers: 0x00769C3D, 0x00769CAD, 0x00769D03, 0x00769D53, 0x00769DA1
SizeAddress = 0x00769BEB
OldSize = 37
NewSize = 297
}
Hashtable = {
comment =multipart 1/2 - caller 0x009dbf36
SizeAddress = 0x009DBF03
OldSize = 131213
NewSize = 905671
}
Hashtable = {
comment =multipart 2/2 - caller 0x009dbf36
SizeAddress = 0x00B06140
OldSize = 131213
NewSize = 905671
}
Hashtable = {
comment =caller 0x009e2726
SizeAddress = 0x009E26F3
OldSize = 37
NewSize = 297
}
Hashtable = {
comment =caller 0x00a10de6
SizeAddress = 0x00A10DB3
OldSize = 37
NewSize = 297
}
}


Fast travel from save crashes: 0/5
Streamsave on new game crashes: 0/1

I stopped here because I did most of the "bad" tests first and already seemed to know what was making it unstable...

So the only thing I did to make it crash was change iHeapSize.

iHeapSize = 1024
-------------------------
Fast travel from save crashes: 3/5
Streamsave on new game crashes: 1/1

Turn off experimentals == Still crashes at 1024. I didn't test the fast travel from save method. 1024 just doesn't seem stable somehow.

I don't really understand the sudden turnaround. I had it set at 1024 and was doing fine for a long time. Then I only recently had a few crashes. I figured out that other issue before making this post too, so they're certainly not related. It's still crashing in a reproducible way. Some people swear by 1024 iHeapSize. But I am reproducing crashes at 1024 very consistently. Like I said in my last post I have 12GB of RAM, 64-bit Windows 7, and the EXE is LAA. I know my game is basically vanilla at the moment, but some people say they can't even play heavily modded games without 1024 set in their INI. I wonder if it wouldn't be crashing if I had a huge load order...
User avatar
Taylor Bakos
 
Posts: 3408
Joined: Mon Jan 15, 2007 12:05 am

Next

Return to IV - Oblivion