虚拟机运行3D游戏从来不是简单勾选一个选项就能解决的事。传统虚拟显卡通过软件模拟,把玩家的Direct3D或OpenGL请求转换成宿主机的API调用,再由CPU转发给物理显卡。这条路径引入的延迟非常大,帧数跌到十几帧并不奇怪。要获得接近原生的体验,必须从图形调用路径入手,而不是盲目增加显存或CPU数量。
GPU直通是当前最接近物理机性能的做法。它把宿主机上的一块物理显卡完整分配给某一台虚拟机,guest系统直接和显卡硬件通信,不经过任何虚拟显卡层。游戏看到的就是一块真实显卡,驱动也使用官方版本,性能几乎不受虚拟化影响。代价是你需要额外一块显卡留作宿主机使用,CPU、主板和BIOS都要支持Intel VT-d或AMD IOMMU。在Linux宿主机上,把这个设备的厂商和设备ID绑定到vfio-pci驱动,然后在QEMU启动参数里透传进去,Windows虚拟机会自动识别出完整显卡型号,装上驱动之后就能玩游戏。我自己的测试里,一块中端显卡直通到Windows 10虚拟机后,3DMark图形分比物理机只低大约4%,《荒野大镖客2》在1440p中画质下可以维持在70帧左右。NVIDIA消费级显卡在虚拟机里偶尔报错误43,原因是驱动检测到了KVM虚拟化,改动启动参数隐藏虚拟化特征就能解决。
直通虽然高效,硬件门槛让很多玩家望而却步。更轻量的方案是图形半虚拟化,用一套转发层把虚拟机的图形请求交给宿主机GPU加速。QEMU/KVM里的virtio-gpu加上virglrenderer就是一个典型的组合,不需要第二块显卡,通过OpenGL传递渲染任务,虚拟机上运行2015年之前的多数游戏、轻量独立游戏没有大问题。VMware Workstation自带的SVGA 3D加速走的是类似思路,安装了VMware Tools之后,能对OpenGL 3.3和DirectX 11提供基本支持,适合《传送门2》《模拟人生》这类游戏。这类方案的性能上限远低于直通,因为还要经过一层协议转换,实际帧数往往是物理机的30%到60%,但胜在配置简单,不改变宿主机显卡工作方式。
不要忽略内存和CPU的分配。给游戏虚拟机至少8GB内存和4个vCPU,CPU模式使用host-passthrough,让guest具备完整的X86指令集,否则许多游戏会在启动时崩溃。磁盘模型建议使用virtio-blk或者NVMe直通,机械硬盘或默认的SATA虚拟盘在场景载入时会出现明显卡顿。Windows虚拟机中还要关闭“快速启动”和Hyper-V,这两个功能经常干扰图形栈的D3D/OpenGL访问,造成帧数骤降。
如果既不想占用整块显卡,又嫌半虚拟化性能不够,可以考虑远程串流作为补充。在宿主机上运行游戏,虚拟机里装Parsec或Steam Link客户端接收视频流,这样虚拟机上只是播放画面和回传操作,对显卡模拟没有要求。游戏在宿主机上跑,虚拟机里依然能看到流畅画面,输入延迟可以控制在20毫秒以内,取决于局域网质量。但严格说这不是让虚拟机自己渲染3D,只是曲线救国。

说到底,想让虚拟机真正运行3D游戏,