Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 强制使用nVidia Optimus的系统为我的应用程序使用真正的GPU?_Delphi_Opengl_Nvidia - Fatal编程技术网

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

Delphi 强制使用nVidia Optimus的系统为我的应用程序使用真正的GPU?,delphi,opengl,nvidia,Delphi,Opengl,Nvidia,我希望我的应用程序始终在nVidia Optimus笔记本电脑上使用真正的gpu运行 来自“在Optimus系统上启用高性能图形渲染”,(): 全局变量NvOptimusEnablement(在驱动程序版本302中新增) 从版本302驱动程序开始,应用程序开发人员可以 在运行时引导Optimus驱动程序使用高性能 用于渲染任何应用程序的图形–即使是 没有现有的应用程序配置文件。他们可以这样做 正在导出名为NvOptimusEnablement的全局变量。擎天柱 驱动程序查找导出的存在和值。只有L

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

来自“在Optimus系统上启用高性能图形渲染”,():

全局变量NvOptimusEnablement(在驱动程序版本302中新增) 从版本302驱动程序开始,应用程序开发人员可以 在运行时引导Optimus驱动程序使用高性能 用于渲染任何应用程序的图形–即使是 没有现有的应用程序配置文件。他们可以这样做 正在导出名为NvOptimusEnablement的全局变量。擎天柱 驱动程序查找导出的存在和值。只有LSB 德沃德家族在这个时候很重要。值0x00000001表示 该渲染应使用高性能图形执行。A. 值0x00000000表示应忽略此方法。 用法示例:

问题是,我想用Delphi来实现这一点。据我所知,Delphi不支持导出变量,即使存在一些黑客攻击。我确实试过一些,但没能成功


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

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

据我所知,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 E2276无法导出标识符“NvOptimusEnablement”
我不明白为什么编译器不喜欢第二个版本。可能是个虫子。但是第一个版本的解决方法就很好。< /P>如何创建一个应用程序配置文件?这个Q看起来像个重复:当你从C++程序中导出全局时,名字被修饰了。使用dumpbin或depends查找。然后对delphi导出应用相同的修饰。@WarrenP:应用程序配置文件是安装后需要手动完成的事情,我不希望这样。也许它可以作为安装的一部分。@Paul不,不是。Stdcall功能将被装饰。Cdecl函数没有修饰。不,不可能链接静态库。@DavidHeffernan:从技术上讲,这应该适用于后处理步骤中的PE二进制文件。GNUBINUTILS包含一个名为“objcopy”的程序,当涉及到二进制操作时,它有点像瑞士军刀。您可以使用objcopy将静态库复制到已经存在的PE.exe中,从而创建所需的效果。只是一个想法;我从来没有试过,但我觉得值得一试。你的答案显然还是错的。事实上这是不正确的。导出一个全局文件也很简单。正如在评论中找到的链接所示。@DavidHeffernan:这在事实上怎么是不正确的?完全可以在一个最低级别上操作二进制文件,就像汇编程序一样。事实上它是不正确的,因为它不易处理,将一个static。LIB强制输入一个Delphi模块。即使是这样,尝试这样做也是毫无意义的。我已经设法在OpenGL包装单元和初始化部分I asm MOV$1中放置了一个变量。我在某个地方读到,否则编译器会忽略它。在运行PE Explorer时,有一个名称正确且值为1的导出。不幸的是,我面前没有optimus笔记本电脑,所以我要到明天才能测试。但是我的问题的Delphi部分似乎已经解决了。你根本不需要使用asm。编译器不会优化对全局变量的写入。是的,导出是正确的,asm替换为
NvOptimusEnablement:=$1OP关于Delphi不能导出变量的断言似乎是不正确的?@WarrenP这是正确的。这真是个骗局。但问题是,由于我不知道的原因,无法导出初始化变量。
E2276 Identifier 'NvOptimusEnablement' cannot be exported