《1937特种兵:敌后武工队》Win10/Win11 兼容性排查与解决方案

2026/07/18 tool 1937特种兵 · 老游戏兼容 · Win10 · Win11 · DirectDraw · cnc-ddraw · DirectInput · 游戏补丁 7240 字 · 约 21 分钟 阅读 ...
记录《1937特种兵:敌后武工队》绿色版在 Win10/Win11 上的兼容性排查过程与最终补丁方案:cnc-ddraw 图形兼容层、DirectInput 代理、运行时内存补丁、VSync 微卡修复,以及分发包安装与验证记录。

初次测试日期:2026-07-17
文档及分发包更新:2026-07-18,补丁版本 v1.1.0
游戏目录:E:\1937\1937tzb_1229
适用程序:本目录中的绿色版 M1937.exe
当前状态:可启动、可进菜单、可进入第一关并正常操作;窗口持续响应,偶发微卡问题已进一步处理。

1. 最终方案介绍

这不是一个单一的“兼容模式”问题,而是四条老式 Windows 游戏链路叠加造成的:

  1. 原生 DirectDraw 显示路径与现代 Windows 不兼容;
  2. 绿色版的资源库检查在当前环境下产生误报;
  3. 启动影片和 DirectInput 轮询期间长期不处理 Windows 窗口消息,导致标题栏显示“未响应”;
  4. 未同步的 60 FPS 提交与 Windows 桌面合成器相位漂移,造成肉眼可见的偶发重复帧/微卡。

最终方案由两层组成:

  • 使用官方 cnc-ddraw 将旧 DirectDraw 调用转换到 Direct3D 9,并负责窗口化、缩放和限速;
  • 使用本游戏专用的 dinput.dll 兼容层转发系统 DirectInput、补充窗口消息处理,并在内存中跳过误报分支和两个问题启动影片。

磁盘上的原版 M1937.exe 没有被修改。最终又为图形层开启 VSync,使测试中的桌面合成丢帧率由 18.81% 降为 0%

最终方案不是单纯打开 Windows“兼容模式”,而是在游戏进程外围补齐旧引擎依赖的运行环境:

层次最终处理解决的问题
图形兼容cnc-ddraw 7.1.0.0、Direct3D 9、固定 60 FPS、VSyncDirectDraw 报错、严重卡顿、桌面合成丢帧
输入与消息本游戏专用 32 位 dinput.dll 代理菜单、任务简报、关卡循环长期不处理窗口消息
游戏专用修复校验版本和原字节后进行内存补丁资源库误报和两个问题启动影片
显示模式窗口启动、Alt+Enter 动态采用当前桌面分辨率Win10/Win11 全屏分辨率和缩放问题

所有游戏专用机器码修复都只存在于当前进程内存中。关闭游戏后即消失,原版 EXE、资源、关卡和存档格式均保持不变。补丁也不依赖后台服务或网络连接,可以跟随绿色版目录离线分发。

2. 补丁使用介绍

2.1 已安装目录直接使用

游戏目录中新增或替换的兼容文件如下:

文件作用
ddraw.dllcnc-ddraw 7.1.0.0,替换原生 DirectDraw 显示路径
ddraw.ini本游戏验证过的窗口、渲染、限帧和 VSync 参数
dinput.dll本游戏专用 DirectInput 代理和运行时修复层
M1937.exe.local强制 Windows 优先加载游戏目录中的 dinput.dll
cnc-ddraw config.exe图形兼容层设置程序
Shaders\cnc-ddraw 附带的可选缩放滤镜
启动游戏-窗口模式.cmd推荐启动入口

正常使用时,双击:

E:\1937\1937tzb_1229\启动游戏-窗口模式.cmd

快捷键:

  • Alt+Enter:窗口/全屏切换;
  • Ctrl+Tab:临时释放被游戏锁定的鼠标;
  • Alt+PageDown:最大化窗口(cnc-ddraw 默认热键)。

2.2 使用分发包安装

分发包文件名:

1937特种兵-Win10-Win11兼容补丁-v1.1.0-20260718.zip

压缩包不包含原游戏,只包含补丁运行文件、安装/卸载脚本、使用帮助、完整技术说明、许可证和本项目自研兼容层源码。

安装步骤:

  1. 解压压缩包到任意目录;
  2. 双击 安装补丁.cmd
  3. 输入 M1937.exe 所在游戏目录;
  4. 安装器校验主程序 SHA-256,备份目标目录中已有的同名兼容文件;
  5. 安装完成后双击游戏目录中的 启动游戏-窗口模式.cmd

也可以在命令行指定目录:

安装补丁.cmd "E:\1937\1937tzb_1229"

卸载时双击 卸载补丁.cmd 并指定同一游戏目录。首次安装备份保存在游戏目录下的 .1937-compat-backup-before-v1.1.0,卸载脚本会恢复其中原有文件,并保留备份本身。

2.3 手动安装

不运行脚本时,可将包内 payload 文件夹中的所有内容复制到 M1937.exe 所在目录。需要复制的是文件夹内部内容,而不是把整个 payload 目录再嵌套一层。

2.4 分发包内容

包内项目用途
README-使用帮助.md面向最终用户的安装、启动、全屏、卸载和常见问题说明
安装补丁.cmd / 卸载补丁.cmd版本校验、备份、安装及恢复
payload\实际需要复制到游戏目录的全部运行文件
补丁技术说明.md本文档的分发副本
source\dinput-proxy\自研 DirectInput 兼容层的可审查源码和构建脚本
LICENSE-cnc-ddraw.txtcnc-ddraw MIT 许可证
SHA256SUMS.txt包内主要文件完整性校验值

2.5 分发前验证

分发包不是只检查了文件是否存在,而是执行了完整安装流程:

  • 在仅含目标 M1937.exe 的最小目录中,从最终 ZIP 解压后成功安装;
  • 核对 ddraw.dlldinput.dll、本地 DLL 重定向、Shaders、中文启动文件、使用帮助及技术文档均复制成功;
  • 核对最终配置仍为窗口启动、Direct3D 9、60 FPS、VSync、动态桌面分辨率全屏;
  • 用预先存在的 ddraw.ini 哨兵文件验证首次安装备份,并在卸载后逐字恢复;
  • 用不匹配的假主程序验证 SHA-256 拒绝路径,未产生补丁文件或备份;
  • 卸载后原 M1937.exe 保留,所有运行补丁文件被移除,恢复备份继续保留;
  • 检查包内不含原版 M1937.exe、GFL、VWF、SVT、SAV 或其他游戏资源;
  • Windows Defender 对最终压缩包执行自定义扫描,没有产生与本包路径相关的检测记录。

最终交付文件:

E:\1937\release\1937特种兵-Win10-Win11兼容补丁-v1.1.0-20260718.zip
属性
大小2,822,030 字节
SHA-2565FD3A84EEE5976DC4A729596B473CDD904E5E8479AB5C499A11B27AE7E96A2FE
包内文件数39
原游戏内容不包含
最终 ZIP 安装/卸载回归通过
Defender 最终压缩包检测0

同目录提供 1937特种兵-Win10-Win11兼容补丁-v1.1.0-20260718.zip.sha256.txt,便于分发后校验下载完整性。

3. 故障排查过程

3.1 DirectDraw Error DDERR_UNSUPPORTED

原始报错位置:

DirectDraw Error DDERR_UNSUPPORTED
FILE: E:\IntuitionEngine\IEngineGraphic\IEngineScreen.cpp
LINE: 521

游戏依赖 Windows XP 时代的 DirectDraw 表面、显示模式和锁定行为。在 Win10/Win11 上直接调用时,部分操作会返回 DDERR_UNSUPPORTED;即使偶尔成功,显示和限速路径也会严重卡顿。

处理方法:把官方 cnc-ddraw 的 ddraw.dll 放到游戏目录,使游戏的 DirectDraw 调用在进程内转换为现代渲染后端。最终选择 renderer=direct3d9,原因是这台机器上它能够稳定创建窗口、正确显示 2D 画面,并且 Present 调用耗时很低。

结果:DDERR_UNSUPPORTED 消失,窗口画面正常出现。

3.2 Can't Load Game Files Library!

该弹框并非资源文件真的丢失。排查时确认:

  • 1937Resources.GFLInterMedia.GFL 均存在且能成功打开;
  • 资源归档读取和解包流程已经通过;
  • 弹框来自绿色版自身的旧环境检查/返回值判断,是误报。

没有采用“每次自动点击弹框”的临时方案,而是在启动时仅修改进程内存中的条件跳转:

  • RVA:0x0000734A
  • 预期原字节:74 0C
  • 运行时替换:EB 0C

补丁带有原字节校验;程序版本不匹配时不会盲目写入。

结果:弹框从根因处被抑制,游戏资源仍由原流程加载。

3.3 启动动画长时间“未响应”

两个启动影片为:

  • GamekingLogo.svt
  • 1937Intro.svt

老影片播放/等待循环在当前系统上耗时很长,且期间不取出 Windows 消息队列中的消息,因此系统把窗口标为“未响应”。继续等待后可能进入菜单,但等待时间和体验不可接受。

处理方法:在内存中将只负责排入上述两个启动影片的 29 字节调用序列改为 NOP:

  • RVA:0x0000762C
  • 长度:29 字节;
  • 同样先校验完整原字节,再执行内存修改。

此修改只跳过片头,不删除 .svt 文件,也不跳过任务/关卡视频。

结果:启动直接进入菜单路径,不再经历片头假死。

3.4 点击“开始游戏”及任务简报阶段“未响应”

进一步测试发现,问题不只出现在片头:菜单、任务简报和游戏循环中的某些 DirectInput 轮询也会长时间占住线程,却不分发窗口消息。

专用 dinput.dll 的处理方式:

  1. 从 Windows 系统目录加载真正的 dinput.dll
  2. 转发 DirectInputCreateA 及原 DirectInput 设备接口;
  3. AcquireGetDeviceStateGetDeviceData 前处理最多 64 条待处理窗口消息;
  4. 保留 WM_QUIT,正常分发键盘、鼠标、绘制和窗口状态消息。

这样没有改变游戏输入语义,只补上现代 Windows 判断窗口是否响应所需的消息泵。

结果:启动、菜单、任务简报和第一关地图阶段均持续 Responding=True

3.5 可玩但偶尔“顿一下”

排查假设

本机环境有几个潜在因素:

  • 游戏位于 ST1000DM003 SATA 机械硬盘;
  • 同时存在 60 Hz、144 Hz 和虚拟显示适配器;
  • 当前配置同时限制显示帧率和游戏逻辑 Tick;
  • vsync=false 时,固定 60 FPS 与 60 Hz 桌面合成器可能发生相位漂移。

为避免截图采样自身影响游戏,使用 Intel 官方 PresentMon 1.10.0 直接采集 Direct3D 9 Present 事件,并由自动测试进入第一关。

原配置结果

原配置为 maxfps=60maxgameticks=60limiter_type=4vsync=false

第一关稳定阶段的 11 秒样本:

指标结果
Present 数量638
帧间隔 P5016.672 ms
帧间隔 P9517.235 ms
帧间隔 P9917.409 ms
最大帧间隔17.856 ms
超过 25 ms0
被桌面合成器丢弃120(18.81%)

这说明游戏和显卡有能力稳定地产生约 60 FPS,卡顿不是 GPU 性能不足,也不是这一段中机械硬盘阻塞了渲染;问题在于部分已提交帧没有被显示,玩家会看到间歇性的重复帧。

方案对比

  • vsync=true:丢弃帧降为 0,保留固定 60 FPS;
  • maxfps=-1(自动跟随屏幕刷新率):在本机多显示器/虚拟显示环境中误判,后段退化到约 10 FPS,已否决;
  • 切换 OpenGL 或降低 D3D9 滤镜:现有 Present/GPU 开销已经很低,没有必要增加兼容性变量;
  • 强制单 CPU 核:cnc-ddraw 自身也提示可能影响性能或声音,当前无冻结且单核未满载,因此保持关闭。

最终长时间回归

最终配置使用固定 60 FPS + VSync。第一关连续 21.52 秒有效样本:

指标结果
Present 数量1292
帧间隔 P5016.667 ms
帧间隔 P9517.100 ms
帧间隔 P9917.458 ms
最大帧间隔18.977 ms
超过 25/33/50 ms0 / 0 / 0
被桌面合成器丢弃0
“未响应”采样0
单个逻辑核心占用约 21.1%
关卡阶段进程读取量约 167 KB

因此,本次发现的偶发微卡已通过 VSync 修正。VSync 理论上会增加最多约一帧输入等待,但对这款即时战术游戏影响很小,换来的是稳定的显示节奏。

4. 最终核心配置

ddraw.ini 中对本游戏起关键作用的全局项如下:

[ddraw]
windowed=true
maintas=true
renderer=direct3d9
maxfps=60
vsync=true
adjmouse=true
noactivateapp=true
maxgameticks=60
limiter_type=4
singlecpu=false
toggle_upscaled=true

说明:

  • maxfps=60 只限制实际显示提交频率,不改变游戏速度;
  • maxgameticks=60 限制旧引擎逻辑循环,避免忙等占满一个核心;
  • limiter_type=4PeekMessage 路径限速,与本游戏消息循环最匹配;
  • vsync=true 消除本机实测到的 DWM 合成丢帧;
  • singlecpu=false 避免旧游戏被不必要地锁到一个核心;
  • toggle_upscaled=true 使 Alt+Enter 全屏时采用当前显示器的桌面分辨率;本机当前为 1920×1080,系统分辨率改变后无需重新写死宽高;
  • 窗口宽高和位置会由 cnc-ddraw 根据用户调整自动保存,不属于补丁关键参数。

4.1 全屏分辨率验证

全屏分辨率没有写死为 width=1920height=1080,而是由 cnc-ddraw 在切换时读取当前显示器模式。这样以后把 Windows 桌面改成其他分辨率,游戏全屏也会自动跟随。

本机实测:

阶段客户区尺寸窗口位置结果
切换前窗口模式1024×768(440, 125)正常
Alt+Enter 全屏1920×1080(0, 0)与主屏当前分辨率一致
再次切回窗口1024×768(440, 125)原尺寸恢复

测试期间进程始终保持响应。maintas=true 会保留游戏原始 4:3 比例,因此在 16:9 的 1920×1080 屏幕上左右留黑边,避免画面被横向拉伸;这是预期行为。

5. 完整验证记录

已执行的功能回归包括:

  • 冷启动约 8 秒进入主菜单;
  • 无 DirectDraw 错误;
  • 无资源库误报弹框;
  • 启动、菜单、任务简报和地图阶段窗口持续响应;
  • 自动进入第一关“营救行动”;
  • 实际在地图中下达移动命令,角色正常行走;
  • 早期 6 秒、约 30 次/秒的画面采样中,181 个相邻画面对有 136 对发生有效更新;
  • 最终 PresentMon 21.52 秒关卡采样无丢帧、无超过 25 ms 的 Present 间隔;
  • Windows Defender 分别扫描最终 M1937.exedinput.dll,未发现威胁。

偶发卡顿复测资料保存在:

E:\1937\stutter-investigation\results

其中最终原始帧事件为 pm-final-extended.csv,对应自动测试进程数据为 pm-final-extended-driver.csv.txt

自动化测试曾生成一个 388 字节的测试存档 1937m010.sav。它已从游戏目录移出并保留为 E:\1937\stutter-investigation\1937m010.sav.test-generated,不会占用玩家的存档槽。

6. 完整性与安全边界

最终文件 SHA-256:

文件SHA-256
M1937.exeF4DD1131DF6C993C01EA011F9439BC725E6DC6491B5FBBA47724D7D5B64DA3F3
ddraw.dll85E0F7D530DFDA134793A57CB3E76B0287DCC96892EE57162DD68F47283B03A9
dinput.dllE3151FB928A92C9EE15DA41587F87FCA631209C504D48CAE44B179D543552CC5
ddraw.ini477A2CCD6243F17640DE23EAD287ADC7FB432923AC50091F9E99D1885465B04F

dinput.dll 只对满足下列特征的程序应用运行时补丁:

  • PE32 主程序基址为 0x00400000
  • 映像大小为 0x00124000
  • 每个补丁位置的原始机器码与预期字节完全一致。

任一条件不满足时,不写入该位置。补丁不联网、不修改关卡、存档和资源文件。

源码和构建脚本位于:

E:\1937\patch-project\dinput-proxy

分发包中另附相同源码:source\dinput-proxy

7. 恢复原版

通过 v1.1.0 分发包安装时,优先运行包内 卸载补丁.cmd。卸载器只移除 payload 清单中的补丁文件,并恢复首次安装前保存到 .1937-compat-backup-before-v1.1.0 的同名文件;备份目录本身会继续保留。

本机开发目录还保留了补丁制作前的完整原始目录备份:

E:\1937\backups\1937tzb_1229-before-win10-win11-compat-20260717

关闭游戏后,将下列文件改名即可停用兼容层:

ddraw.dll
dinput.dll
M1937.exe.local

如需完全恢复初始目录,可从上述备份复制原文件。游戏关卡、资源和已有存档没有被兼容补丁改写。

8. 后续使用注意事项

  • 建议把游戏窗口留在当前 60 Hz 主显示器上。固定 60 FPS 在 144 Hz 屏幕上不能整除刷新周期,拖到另一块高刷屏后可能重新出现轻微节奏不均;
  • 机械硬盘会让首次进入大关卡或读取大型资源时产生正常的加载等待。最终关卡稳定阶段并未发现磁盘读取引起的渲染停顿;若只在切换关卡时顿一下,可将整个绿色版复制到 SSD,而不是只移动部分资源;
  • 不建议为游戏目录设置杀毒软件永久排除项。若第三方安全软件确实在每次读取旧资源时扫描,可先做一次按需扫描并观察,不应直接降低系统安全策略;
  • 不要把 maxfps 改成 -1。本机有多个刷新率和虚拟显示适配器,实测自动刷新率模式会误判;
  • 如果手动修改过 ddraw.ini 后问题复现,优先恢复本文第 4 节的十个关键参数。

9. 参考项目

文档信息