OK i'm not sure if i'm posting it in a right section, but as long as this limitation of "Batman: Arkham Asylum" game is hardware-related, i'm doing it here (correct me if i'm wrong, please).
I assume you all are aware of the issue, if you are here. If not, you can read some article
or that official shameful tutorial
So i recently tried to play Batman on my system, only to find out i can't enable MSAA, even using ATI Tray Tools. Maybe there are bugs in a hook library, or some problems because of other installed software, i don't know. The only 2 possible ways i found at the public are:
- VendorID emulation with ATT
- didn't work for me neither on XP nor 7.
- MSAA patch by Thomas Bruckschlegel
- works perfectly, but causes Windows LIVE to be disabled rightaway. This means no profiles, no progress save.
Tried to investigate this a bit more and discovered that the whole thing is plain simple. It took me just a couple of days to create a working solution.
It was tested by me on Windows XP x86 and Windows 7 x64. Let me know if it works for you or not.
__________________ Batman: Arkham Asylum - MSAA fix (100422) * DESCRIPTION:
This patch will fix the anti-aliasing issue in "Batman: Arkham Asylum" game to enable the native MSAA support for any non-NVIDIA GPU.
- intended only for v1.1 of the game.
- tested only with PhysX System Software 9.10.0222 installed. * HOW TO USE:
1. Drop the fix to the root game directory (not to the \Binaries\ subfolder but near it).
2. Launch the fix and press the "Cake" button. * NOTE:
- Do not use this version with NoAA option. Or rename/delete PhysXLoader.dll from \Binaries\ folder if you want to play without anti-aliasing.
Here is how the difference looks like on my system:
Some technical details, if anyone is interested...
I discovered that both known methods are not 100% proper. When you are forcing your non-NVIDIA GPU to have a "10DE" VendorID, it actually helps to force a native anti-aliasing. But don't forget that this game is UE3-based. There are 3 checks inside the game:
1. Compare VendorID to 1002
(ATI) and decide if DisableATITextureFilterOptimizationChecks
should be used.
2. Compare VendorID to 10DE
(NVIDIA) and decide if UseMinimalNVIDIADriverShaderOptimization
should be used.
3. Compare VendorID to 10DE
(NVIDIA) and decide if MSAA is allowed.
As you see, it is actually not a good idea to emulate VendorID for your non-NVIDIA GPU. Both (1 and 2) options may cause a minimal impact on the performance and visual experience, but since it is a UE3 we can't deny that they are somewhat important.
Ironically, MSAA patch by Thomas Bruckschlegel patches both (2 and 3) places, and you still end up with not 100% proper engine configuration for your non-NVIDIA GPU.
It was easy to patch only a 3rd check to force MSAA support, but Windows LIVE made it impossible statically (patched inside the .exe) and almost impossible dynamically (patched in memory during a runtime). If you patch the executable file - LIVE just won't load, and when you patch it in memory - the game will crash within a minutes, as a result of LIVE security checks.
My solution consists of 4 parts:
- patch the BmLauncher.exe to allow setting MSAA level with original launcher.
- modified PhysXLoader.dll v188.8.131.52 (that's why it was tested only with PhysX SS 9.10.0222)
- dll file #1
- dll file #2
Just to clarify, the whole thing has nothing to do with PhysX, it may even work with other PhysX SS packages (although i'd recommend trying 9.10.0222 first). PhysXLoader.dll is just one of the few 3rd party dlls, which are being loaded somewhere near the engine initialization - at a point where the game did not process MSAA settings yet. The modified PhysXLoader.dll loads my custom dll #1 along with itself, and the purpose of #1 is to patch the needed (3rd) check in memory. Additionally, it creates a code for loading a dll #2 somewhere after MSAA settings processing place.
The purpose of dll #2 is to replace all the modified (and already executed) code with original code, so nothing will detect code modifications during a runtime.
You just end up with correctly-processed MSAA settings regardless of your GPU's VendorID and unmodified code section in memory, thus LIVE won't cause a crash.
You can see the result of the crash if you temporary rename or delete my dll #2 (fix.dll) from \Binaries\ folder.