7

nVidia Optimus ラップトップで実際の G​​PU を使用してアプリケーションを常に実行したい。

「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 を使用してこれを行いたいということです。私が読んだことから、いくつかのハックが存在するにもかかわらず、Delphi は変数のエクスポートをサポートしていません。いくつか試してみましたが、うまくいきませんでした。

同じ nvidia ドキュメントで、適切な GPU を強制することは、リストされているいくつかの dll の 1 つに静的にリンクすることによって達成できることを読みました。しかし、使用していないdllにリンクしたくありません。(opengl.dll がそれらの 1 つでない理由は、私にはわかりません。) 単純なエクスポートされた変数は、はるかにきれいに見えます。

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' はエクスポートできません

コンパイラが 2 番目のバージョンを好まない理由がわかりません。おそらくバグです。しかし、最初のバージョンの回避策は問題ありません。

于 2013-03-13T09:52:29.073 に答える
0

私は Delphi の専門家ではありませんが、私の知る限り、Delphi から C で実装された静的ライブラリにリンクすることは可能です。したがって、このエクスポートを提供するだけで、Delphi プログラムに静的にリンクされる小さなスタブ ライブラリを作成するだけです。これにより、必要なエクスポートが追加されます。

于 2013-03-12T22:10:37.807 に答える