经过六个月的开发,DXVK(Direct3D 到 Vulkan 转换层)的新版本正式发布。这个开源库可以将 Direct3D 8、9、10 和 11 的 API 调用转换为 Vulkan 命令,从而支持运行为 Vulkan 开发的 3D 应用程序和游戏。 Windows在没有原生 Direct3D 支持的系统上,同时利用更高效的 Vulkan 图形 API。
主要变化
新版本已过渡到使用 Vulkan 1.4 规范和扩展,因此需要 兼容驱动程序.
DXVK 现在使用 dxbc-spirv 为所有受支持的着色器模型编译着色器。这解决了之前无法解决的许多问题:
游戏中的渲染问题,可能是由于游戏依赖未定义行为,也可能是由于FXC在某些情况下生成无效代码造成的,例如《邮差:脑损伤》(Postal: Brain Damaged)和《雪地奔驰》(Snowrunner)。
生成的代码比简单转换的 SPIR-V 代码更紧凑,显著降低了 DXVK 的内存占用。在《守望先锋》或《战神》等游戏中,这大约可以节省 1 GiB 的系统内存。
着色器编译现已完全移至工作线程,这可以缩短《往日不再》和《最终幻想14》等游戏的启动时间,或在某些情况下减少卡顿。此前,DXVK 在应用程序线程中执行 SPIR-V 转换,仅在工作进程中编译实际的 Vulkan 管线。
编译后的 DXVK 着色器的中间表示形式现在缓存在当前 Wine 前缀的 AppData/Local 目录下的磁盘中。这是因为与旧编译器相比,编译时间有所增加。可以使用 DXVK_SHADER_CACHE_PATH 环境变量更改缓存路径。
新的 Vulkan 扩展 VK_EXT_descriptor_heap 现在在支持它的驱动程序中默认使用。
与旧的基于 VK_EXT_descriptor_buffer 的绑定模型实现相比,这种新模型有望提供大致相同水平的 CPU 密集型性能,同时避免 Nvidia GPU 的性能损失(需要 nvidia-drivers-595.84 及更高版本)。
D3D9 的变化
为了模拟传统的固定功能渲染管线(该管线允许 D3D8 和 D3D9 游戏在不使用着色器的情况下进行渲染),DXVK 之前会根据管线状态动态生成自己的着色器代码。在某些游戏中,例如《虚幻竞技场 2004》,即使长时间游戏后,这也会导致明显的卡顿。
为了解决这个问题,DXVK 现在实现了一个固定功能管线,即一对超级着色器,并在后台编译其优化变体。
优化缓冲区加载
为了更贴近行为 Windows以前直接放置在 VRAM 中的各种类型的缓冲区现在可以按需加载,并且已经实施了 RAM 限制策略,修复了许多 32 位 D3D9 游戏中与地址空间相关的崩溃问题。
这些改变也可能提高 GTA IV 等游戏中没有可调整大小的 BAR 的系统的性能。
在充分支持 VK_EXT_sample_locations 和 VK_EXT_extended_dynamic_state3 的系统上,D3DRS_MULTISAMPLEANTIALIAS 渲染状态现在可以正常工作,允许应用程序在渲染到多采样渲染目标时使用单采样光栅化。这解决了《纪元1701》、《战争之人:突击小队》以及其他启用 MSAA 的游戏中出现的 UI 渲染问题。
共享资源现在可以与原始的 Wine 实现一起使用,不再需要 Proton 特定的补丁。
另外值得一提的是,本次更新还修复了许多游戏的问题,现在这些游戏的运行效果会更好。
来源: linux.org.ru
