使用nVidia Optimus强制系统将真正的GPU用于我的应用程序?

时间:2013-03-12 21:52:36

标签: delphi opengl nvidia

我希望我的应用程序始终使用nVidia Optimus笔记本电脑上的真实gpu运行。

从“在Optimus系统上启用高性能图形渲染”,(http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf):

  

全局变量NvOptimusEnablement(驱动程序版本302中的新增功能)   从Release 302驱动程序开始,应用程序开发人员可以   在运行时指示Optimus驱动程序以使用高性能   图形来呈现任何应用程序 - 甚至是那些应用程序   没有现有的应用程序配置文件他们可以做到这一点   导出名为NvOptimusEnablement的全局变量。擎天柱   driver查找导出的存在和值。只有LSB   在这个时候,DWORD很重要。值0x00000001表示   应使用高性能图形执行渲染。一个   值0x00000000表示应忽略此方法。   用法示例:

extern "C" {   _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; }

问题是我想用Delphi做这件事。据我所知,即使存在一些黑客攻击,Delphi也不支持导出变量。我确实尝试了其中一些,但无法使其发挥作用。

在同一个nvidia文档中,我读到强制正确的GPU可以通过静态链接到极少数列出的dll之一来完成。但我不想链接到我没有使用的dll。 (为什么opengl.dll不是我的其中之一。)一个简单的导出变量似乎更清晰。

2 个答案:

答案 0 :(得分:4)

  

据我所知,Delphi不支持导出变量。

该陈述不正确。这是最简单的示例,演示如何从Delphi DLL导出全局变量:

library GlobalVarExport;

uses
  Windows;

var
  NvOptimusEnablement: DWORD;

exports
  NvOptimusEnablement;

begin
  NvOptimusEnablement := 1;
end.

我认为你的问题是你这样写的:

library GlobalVarExport;

uses
  Windows;

var
  NvOptimusEnablement: DWORD=1;

exports
  NvOptimusEnablement;

begin
end.

无法使用此错误编译:

E2276 Identifier 'NvOptimusEnablement' cannot be exported

我不明白为什么编译器不喜欢第二个版本。这可能是一个错误。但是第一个版本的解决方法很好。

答案 1 :(得分:0)

我不是Delphi专家,但是AFAIK可以链接到Delphi中用C实现的静态库。所以我只是创建一个小的存根库,只提供这个导出,它静态链接到你的Delphi程序。这会增加您需要的导出。