文章

Windows11老游戏启动后反复切换窗口和全屏问题修复

Windows11老游戏启动后反复切换窗口和全屏问题修复

Windows11老游戏启动后反复切换窗口和全屏问题修复

一些较老的 Windows 游戏在 Windows 10/11 上可能出现典型的全屏兼容问题:

1
2
3
4
5
6
7
Windowed 正常
    ↓
Fullscreen 持续闪烁
    ↓
表现类似 Fullscreen <-> Desktop 反复切换
    ↓
Alt + Enter 返回 Windowed 后立即正常

本文记录一个已经实际验证有效的解决方案: 使用 dgVoodoo2 接管游戏原本的 DirectDraw / Old Direct3D 图形接口.

已验证游戏:

1
2
Zuma Deluxe
Insaniquarium! Deluxe

两者的全屏闪烁问题均已解决.

W - 直接使用

1. 下载 dgVoodoo2

下载普通 Release:

1
dgVoodoo2_xx_x.zip

不要下载:

1
2
3
4
*_dbg.zip
*_dev64.zip
dgVoodooAPI_*.zip
Source Code

2. 复制 x86 Wrapper

解压后进入:

1
MS\x86\

复制:

1
2
3
DDraw.dll
D3DImm.dll
D3D8.dll

3. 放到真正运行的游戏 EXE 目录

不要默认放到 Steam 安装目录.

先运行游戏, 然后:

1
2
3
4
Task Manager
-> 游戏进程
-> Right Click
-> Open file location

把三个 DLL 放到真正运行的 EXE 同级目录:

1
2
3
4
5
Game\
├─ Game.exe
├─ DDraw.dll
├─ D3DImm.dll
└─ D3D8.dll

然后重新启动游戏, 测试 Fullscreen.

4. 两个已验证案例

Insaniquarium! Deluxe

实际运行目录:

1
C:\ProgramData\PopCap Games\Insaniquarium\

最终:

1
2
3
4
5
C:\ProgramData\PopCap Games\Insaniquarium\
├─ popcapgame1.exe
├─ DDraw.dll
├─ D3DImm.dll
└─ D3D8.dll

Zuma Deluxe

Steam 版同样会使用 ProgramData 中的实际游戏程序:

1
C:\ProgramData\PopCap Games\Zuma\

实际 EXE:

1
C:\ProgramData\PopCap Games\Zuma\popcapgame1.exe

处理方法相同.

5. 回滚

如果出现问题, 删除复制进去的:

1
2
3
DDraw.dll
D3DImm.dll
D3D8.dll

即可恢复原来的图形 API 路径.

本次已验证无效的方法

1
2
3
4
5
6
7
Disable Fullscreen Optimizations
关闭 Steam Overlay
关闭 NVIDIA Overlay
关闭 Xbox Game Bar
关闭 Discord Overlay
切换 Hardware Acceleration
关闭 Custom Cursor

I - 原理

问题本质

这类老游戏通常仍然依赖:

1
2
DirectDraw
Old Direct3D

而实际运行环境已经变成:

1
2
3
4
5
6
7
Old Game
    ↓
Old DirectX API
    ↓
Windows 10 / Windows 11
    ↓
Modern GPU Driver

窗口模式可以正常运行, 但 Exclusive Fullscreen 涉及显示模式切换、Surface 创建、图形设备恢复以及 Focus 状态变化.

问题出现后, 可以将现象近似理解为:

1
2
3
4
5
6
7
8
9
10
11
12
13
Game 请求 Fullscreen
    ↓
创建 / 恢复 DirectDraw Surface
    ↓
Fullscreen 状态异常
    ↓
游戏失去或者重新获取图形设备 / Focus
    ↓
游戏再次申请 Fullscreen
    ↓
再次异常
    ↓
循环

最终肉眼看到的就是:

1
2
3
4
5
6
7
Game
Desktop
Game
Desktop
Game
Desktop
...

因此下面这个现象是非常重要的判断依据:

1
2
3
4
5
Fullscreen -> 持续闪烁

Alt + Enter

Windowed -> 立即稳定

如果满足这个特征, 应该优先调查旧 DirectX / Exclusive Fullscreen 兼容问题, 而不是首先怀疑 GPU 性能或硬件稳定性.

dgVoodoo2 做了什么

原来的路径:

1
2
3
4
5
Old Game
    ↓
DirectDraw / Old Direct3D
    ↓
Windows / GPU Driver

加入 dgVoodoo2 后:

1
2
3
4
5
6
7
8
9
Old Game
    ↓
DirectDraw / Old Direct3D
    ↓
dgVoodoo2
    ↓
D3D11 / D3D12
    ↓
Windows / GPU Driver

dgVoodoo2 本质上是一个 Graphics API Compatibility Wrapper.

其官方说明支持:

1
2
3
4
5
6
7
DirectDraw
D3D3
D3D5
D3D6
D3D7
D3D8
D3D9

并将旧 DirectX 图形路径运行在 D3D11 / D3D12 之上.

因此它解决问题的思路并不是:

1
让 Windows 更兼容旧游戏

而更接近:

1
不要再让旧游戏直接依赖原来的旧图形执行路径

由 dgVoodoo2 在旧游戏和现代图形系统之间增加一个兼容层.

这也是为什么它比:

1
2
Windows Compatibility Mode
Disable Fullscreen Optimizations

更加接近这一类问题的根源.

S - 补充说明

1. 我们是怎么找到真正的 EXE 目录的

这是本次排查过程中非常关键的一步.

最开始看到的 Steam 游戏目录是:

1
F:\Steam\steamapps\common\Insaniquarium Deluxe\

里面也确实存在:

1
2
Insaniquarium.exe
InsaniquariumDeluxe.exe

因此直觉上很容易认为 dgVoodoo2 应该直接放在这里.

但 Steam 社区针对 Insaniquarium 的修复指南明确指出:

1
C:\ProgramData\PopCap Games\Insaniquarium

才是游戏实际运行的位置.

指南进一步说明, Steam 目录中的程序会把真正的游戏程序临时解包到该目录运行, 类似一种早期的 DRM / Launcher 机制.

之后在本机实际启动游戏, 通过:

1
2
3
4
Task Manager
-> Insaniquarium
-> Right Click
-> Open file location

再次确认真正运行的是:

1
C:\ProgramData\PopCap Games\Insaniquarium\popcapgame1.exe

因此这个路径不是单纯依赖论坛结论, 而是:

1
2
3
社区资料提供线索
    +
Task Manager 本机验证

两边相互确认.

Zuma Deluxe 也存在相同机制.

相关 Steam 社区资料明确指出, Steam 安装目录中的 Zuma.exe 是 Self-extracting Launcher, 每次运行时都会生成并启动:

1
C:\ProgramData\PopCap Games\Zuma\popcapgame1.exe

因此把 dgVoodoo2 放进 Steam 安装目录并不会被真正的游戏进程加载.

这也是为什么处理老游戏 Wrapper 时, 一个很实用的原则是:

不要问”游戏安装在哪里”, 而应该问”真正运行的 EXE 在哪里”.

2. 为什么 Wrapper DLL 必须放到实际 EXE 附近

Windows 程序加载 DLL 时, 应用程序所在目录是重要的 DLL 搜索位置之一.

因此我们希望形成:

1
2
3
4
5
popcapgame1.exe
    ↓
加载本地 DDraw.dll
    ↓
dgVoodoo2 接管 DirectDraw

而不是:

1
2
3
4
5
popcapgame1.exe
    ↓
运行目录中没有 dgVoodoo2
    ↓
继续使用原来的系统图形路径

所以即使 Steam 安装目录里已经放了 Wrapper:

1
2
3
4
Steam\steamapps\common\Game\
├─ Launcher.exe
├─ DDraw.dll
└─ ...

只要真正执行的是:

1
C:\ProgramData\...\popcapgame1.exe

这些 DLL 就不会达到预期效果.

3. 为什么使用 x86

Wrapper DLL 的 Architecture 必须和加载它的游戏进程一致.

例如:

1
2
3
32-bit Game
    ↓
32-bit DLL

因此这些老 PopCap 游戏需要使用:

1
MS\x86\

而不是 64-bit Wrapper.

即使操作系统本身是:

1
Windows 11 x64

只要游戏进程是 32-bit:

1
Game.exe = x86

就仍然需要 x86 DLL.

4. 为什么第一步只放 DLL

社区教程中有时还会同时复制:

1
2
dgVoodoo.conf
dgVoodooCpl.exe

并修改分辨率、Renderer、Scaling 等选项.

但排查问题时, 更建议先控制变量.

本文实际采用的第一步是只增加:

1
2
3
DDraw.dll
D3DImm.dll
D3D8.dll

然后重新测试原问题.

这样可以非常直接地判断:

1
2
3
4
5
6
7
Original Graphics Path
        ↓
存在问题

dgVoodoo2 Graphics Path
        ↓
问题消失

确认 Wrapper 有效以后, 再根据需要调整:

1
2
3
4
5
6
7
Resolution
Scaling
Aspect Ratio
MSAA
Borderless
Windowed
Renderer Backend

dgVoodoo2 本身也支持强制分辨率、MSAA、Windowed Appearance 和多种低分辨率 Upscaling 方式.

5. 为什么窗口模式正常是重要线索

如果 GPU、本机供电或者游戏核心逻辑本身存在严重问题, 通常不会表现为:

1
2
Fullscreen -> 必现问题
Windowed   -> 立即稳定

而 Alt + Enter 又可以稳定改变故障状态.

因此:

1
2
3
4
5
Fullscreen 异常
+
Windowed 正常
+
Alt + Enter 可以恢复

是一个非常有价值的定位条件.

它不能百分之百证明问题一定来自 DirectDraw, 但足以把调查优先级明显提高到:

1
2
3
4
5
6
Exclusive Fullscreen
Display Mode
DirectDraw
Old Direct3D
Device Lost / Restore
Focus handling

6. dgVoodoo2 不是所有老游戏问题的万能修复

它非常适合调查:

1
2
3
4
5
6
窗口模式正常, Fullscreen 异常
老 DirectX 游戏黑屏
Alt + Tab 后崩溃
切换显示模式崩溃
进入真正的 3D 场景后崩溃
旧 DirectDraw / Direct3D 与现代 Windows 不兼容

但老游戏还可能存在其他问题:

1
2
3
4
5
6
7
8
旧 DRM
旧音频 API
Codec
CPU Timing
多核兼容
文件权限
旧 Runtime
游戏自身 Bug

因此更准确的理解是:

dgVoodoo2 是解决旧 Graphics API Compatibility 问题的一种高价值工具, 而不是通用游戏修复器.

E - 验证与参考

实际验证

本文方案已实际验证:

1
2
3
4
5
Zuma Deluxe
状态: 已解决

Insaniquarium! Deluxe
状态: 已解决

共同故障特征:

1
2
3
Windowed 正常
Fullscreen 持续闪烁
Alt + Enter 返回 Windowed 后立即恢复

加入 dgVoodoo2 x86 Wrapper 后, Fullscreen 恢复正常.

以后遇到类似问题, 可以优先使用下面的判断链:

1
2
3
4
5
6
7
8
9
10
11
12
13
Old Windows Game
        ↓
Windowed 正常
        ↓
Fullscreen 异常
        ↓
Alt + Enter 可以恢复
        ↓
检查 DirectDraw / Old Direct3D
        ↓
确认真正运行的 EXE
        ↓
尝试 dgVoodoo2

参考资料

dgVoodoo2 官方项目: dege-diosg/dgVoodoo2

dgVoodoo2 Release: dgVoodoo2 Releases

Insaniquarium! Deluxe Steam 社区修复指南, 其中明确说明实际运行目录位于 C:\ProgramData\PopCap Games\Insaniquarium, 并给出了 dgVoodoo2 Wrapper 的使用方法: Windows 10 Alt-Tab Crash + Steam UI Scaling Fix

Zuma Deluxe Steam 社区讨论, 其中明确说明 Steam 目录中的 Zuma.exe 是 Launcher, 真正运行的是 C:\ProgramData\PopCap Games\Zuma\popcapgame1.exe: Guide to get Zuma 100% compatible with modern Windows 11 OS

本文由作者按照 CC BY 4.0 进行授权