在Optimus笔记本电脑中以编程方式强制使用NVIDIA GPU

Smo*_*ith 25 c++ directx nvidia optimus

我正在编写一个DirectX游戏,当我在Optimus笔记本电脑上运行它时会使用英特尔GPU,导致可怕的性能.如果我使用上下文菜单强制NVIDIA GPU或将我的可执行文件重命名为bf3.exe或其他一些着名的游戏可执行文件名称,性能就像预期的那样.
显然,当我必须重新分配我的游戏时,这两种方法都不是可接受的解决方案,那么有没有办法以编程方式强制笔记本电脑使用NVIDIA GPU?

我已经尝试使用DirectX来枚举适配器(IDirect3D9 :: GetAdapterCount,IDirect3D9 :: GetAdapterIdentifier)并且它不起作用:仅报告1个GPU(正在使用的GPU).

Dik*_*rAz 37

根据http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf从302驱动程序开始,静态链接以下库之一就足够了:vcamp110.dll,vcamp110d.dll,nvapi.dll,nvapi64.dll,opencl.dll,nvcuda.dll,cudart*.*,或者在程序中导出NvOptimusEnablement变量:

extern "C" {
    _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
}
Run Code Online (Sandbox Code Playgroud)

  • 启用变量+1(和相应的链接); 注意:不适用于我的310驱动程序,但在更新到320后工作 (3认同)
  • 这不再起作用(GTX 960M - 驱动程序 v385.41) (2认同)

Rog*_*ahl 5

http://www.nvidia.com/object/LO_optimus_whitepapers.html上的Optimus白皮书尚不清楚在切换到GPU之前究竟需要什么.白皮书表示已检测到DX,DXVA和CUDA调用,并将导致GPU打开.但此外,该决定是基于NVIDIA维护的配置文件,当然,您的游戏尚不存在.

要尝试的一件事就是进行CUDA调用,例如cuInit(0);.与DX和DXVA相反,英特尔集成显卡无法处理,因此它应该强制切换到GPU.