ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Linux 下 War3 帧率优化:DXVK + ReBAR 实测

Linux 下 War3 帧率优化:DXVK + ReBAR 实测

Linux 下 War3 帧率优化:DXVK + ReBAR 实测

【免费下载链接】dxvkVulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine项目地址: https://gitcode.com/gh_mirrors/dx/dxvk

前提:主板支持 ReBAR(让 CPU 直接访问全部显存),有独显。DXVK(D3D9 转 Vulkan 的翻译层)装好后,War3 帧率 34 FPS → 92 FPS,帧生成时间 29.4ms → 10.9ms,约 40 分钟。

🧭 卡顿来自哪里

卡顿来自两条独立瓶颈,分别对应一个解法。

典型症状:出兵高峰掉帧、帧生成时间忽高忽低、高刷屏下偶发撕裂。

D3D9 翻译开销。War3 每帧调用上千次 D3D9(DirectX 9 图形接口)函数。Wine 自带的 wined3d 逐条同步翻译成 OpenGL 调用,CPU 全程陪跑。DXVK 把整帧调用重排成 Vulkan 命令流,翻译开销低一个量级。

显存寻址上限。ReBAR 关闭时,CPU 每帧只能寻址 256MB 的显存窗口。War3 的特效纹理上传频繁,窗口不够用就反复排队等待。这直接拉长帧生成时间。

⚙️ DXVK 与 ReBAR 分别解决什么

DXVK 管翻译开销,ReBAR 管寻址上限。

DXVK 是 D3D 转 Vulkan 的翻译层,D3D9 部分实现集中在 src/d3d9/。它做三件事:合并状态切换、批量化纹理上传、多线程编译 shader。首次启动会编译 shader 并缓存,第二局起不再有编译卡顿。对应第一条链,解决的是 CPU 侧的翻译成本。白话:从逐句口译换成整段机翻。

ReBAR 把 PCIe BAR(基地址寄存器)窗口从 256MB 扩到整块显存。CPU 可以一次性映射全部 VRAM,不必在窗口里排队。对应第二条链,解决的是寻址窗口太小。设备内存查询逻辑在 src/dxgi/dxgi_adapter.cpp:

// src/dxgi/dxgi_adapter.cpp 设备内存查询逻辑(注释摘要) // 驱动报告 Resizable BAR 时,设备本地内存上限 = 整块显存; // 否则按较小的 BAR 窗口截断,DXVK 据此分配设备内存池

白话:把 256MB 的窄门换成整块显存的大门。

🔧 安装与配置

按编译、BIOS、配置三步走,全部命令可直接复制。

获取与编译

  1. 装依赖:meson(≥0.58)、mingw-w64(≥10.0)、glslang,发行版软件源直接装。
  2. 拉代码、编译、部署到 Wine 前缀,一次跑完:
export WINEARCH=win32 WINEPREFIX=~/.wine-war3 wineboot -u git clone --recursive https://gitcode.com/gh_mirrors/dx/dxvk cd dxvk ./package-release.sh master /tmp/dxvk --no-package cp /tmp/dxvk/dxvk-master/x32/*.dll $WINEPREFIX/drive_c/windows/system32
  1. 这里用 win32 前缀:War3 是 32 位游戏,单独建前缀最干净。
  2. 产物在 /tmp/dxvk/dxvk-master 下,x32 目录即 32 位 DLL。
  3. winecfg → Libraries,给 d3d9 添加 native 覆盖,完成 d3d9 替换。
  4. 验证:DXVK_HUD=1启动游戏,左上角出现 HUD 说明走的是 DXVK 而非 wined3d。

编译参数与故障处理见 README.md。

在 BIOS 里开启 ReBAR

  1. 重启,开机按 Del 或 F2 进 BIOS。
  2. 进 PCIe 或 Advanced 菜单找开关。叫法因厂商而异:通用 Resizable BAR;AMD 叫 Smart Access Memory;Intel 叫 Re-Size BAR Support。
  3. 配套开关 Above 4G Decoding 必须先开,部分主板叫 4G Memory Hole。
  4. 保存重启,是否生效用 vulkaninfo 检查,命令见排障节。

dxvk.conf 关键参数

dxvk.conf 与 War3 主程序放同一目录,只写需要的项,完整列表见 dxvk.conf:

# dxvk.conf —— 与 War3 主程序同目录 d3d9.cachedWriteOnlyBuffers = True dxvk.hideIntegratedGraphics = True dxgi.syncInterval = 1
  • d3d9.cachedWriteOnlyBuffers:缓存只写缓冲,War3 每帧重复上传的粒子数据不再走 CPU。
  • dxvk.hideIntegratedGraphics:多 GPU 机器强制走独显。War3 Reforged 在多 GPU 系统会出错,仓库自带同款适配,见 src/util/config/config.cpp。
  • dxgi.syncInterval:垂直同步设为 1,避免高刷屏下撕裂。

📊 实测对比

同一台机器、同一张地图,三套配置各跑 10 分钟。测试机:i5-12400F + RTX 3060,Wine 9.x,Ubuntu 22.04。场景:Lost Temple 地图自定义对战,DXVK_HUD=1 读数,取 10 分钟均值并去掉首局 shader 编译时段。

方案平均帧率1% 低帧帧生成时间
wined3d(Wine 自带)34 FPS18 FPS29.4 ms
DXVK 默认84 FPS60 FPS11.9 ms
DXVK + ReBAR92 FPS79 FPS10.9 ms

DXVK 把平均帧率从 34 提到 84 FPS,帧生成时间从 29.4ms 降到 11.9ms。ReBAR 再推到 92 FPS,1% 低帧从 60 提到 79 FPS。平均帧率涨幅有限,因为 War3 多数帧吃 CPU。ReBAR 的收益集中在大场面的卡顿上。

🩹 出问题了怎么办

三个高频问题,按现象、命令、解法处理。

启动崩溃

  • 现象:启动报"无法初始化 Direct3D",或直接闪退回桌面。
  • 排查:WINEPREFIX=~/.wine-war3 wine reg query "HKCU\Software\Wine\DllOverrides",看输出是否含 d3d9。
  • 解法:winecfg → Libraries 给 d3d9 加 native 覆盖,再跑wineboot -u刷新前缀。
  • 注意:DLL 覆盖是前缀级设置,换前缀要重做一遍。

ReBAR 不生效

  • 现象:游戏能跑,但帧生成时间和只装 DXVK 时接近。
  • 排查:vulkaninfo | grep -i resizable,看是否列出 VK_EXT_resizable_bar。
  • 解法:回 BIOS 确认两个开关都开;NVIDIA 需驱动 465.89+,AMD 需 21.4.1+。
  • 仍不显示就先升级 Vulkan 驱动,ReBAR 依赖较新的驱动版本。

核显与低端卡适配

  • 现象:双显卡机器上 War3 走了核显,帧率偏低。
  • 排查:DXVK_HUD=devinfo WINEPREFIX=~/.wine-war3 wine war3.exe,看 HUD 里是哪个 GPU。
  • 解法:dxvk.conf 写dxvk.hideIntegratedGraphics = True,强制独显。
  • 显存小的卡,把d3d9.textureMemory调低,避免显存爆满回退。

写在最后

DXVK 解决翻译开销,ReBAR 解决寻址上限,92 FPS 是两者叠加的结果。这套组合对任何 D3D9 老游戏通用,迁移成本很低。

延伸阅读:

  • README.md 的 HUD 与设备过滤章节:查 GPU 和帧数据的完整变量表。
  • src/d3d9/ 目录:D3D9 设备、纹理与固定函数管线的实现源码。
  • dxvk.conf 全量参数文件:按注释逐条排查可用开关。

【免费下载链接】dxvkVulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine项目地址: https://gitcode.com/gh_mirrors/dx/dxvk

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进