7

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

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

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

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

问题是我想使用 Delphi 来做到这一点。从我读过的内容来看,即使存在一些 hack,Delphi 也不支持变量的导出。我确实尝试了其中一些,但无法使其工作。

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

4

2 回答 2

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 标识符“NvOptimusEnablement”无法导出

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

于 2013-03-13T09:52:29.073 回答
0

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

于 2013-03-12T22:10:37.807 回答