2013-03-12 32 views
7

私のアプリケーションは、nVidia Optimusラップトップ上で実際のGPUを使用して常に実行されます。nVidia Optimusを使用してアプリケーションに実際のGPUを使用するように強制しますか?

「オプティマスシステムでの高性能グラフィックスレンダリングを有効にする」から

、(http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf):

Global Variable NvOptimusEnablement (new in Driver Release 302) Starting with the Release 302 drivers, application developers can direct the Optimus driver at runtime to use the High Performance Graphics to render any application–even those applications for which there is no existing application profile. They can do this by exporting a global variable named NvOptimusEnablement. The Optimus driver looks for the existence and value of the export. Only the LSB of the DWORD matters at this time. A value of 0x00000001 indicates that rendering should be performed using High Performance Graphics. A value of 0x00000000 indicates that this method should be ignored. Example Usage:

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

問題は、私は、この使用デルファイをしたいということです。私が読んだことから、いくつかのハックが存在しても、Delphiは変数のエクスポートをサポートしていません。私はそれらのいくつかを試しましたが、動作させることができませんでした。

同じnvidiaドキュメントでは、適切なGPUを強制することは、静的にリストされた一揃いのDLLの1つにリンクすることで実現できます。しかし、私は使用していないdllにリンクしたくありません。 (なぜopengl.dllがそれらのどれでもないのです。)単純なエクスポートされた変数はもっときれいです。

+0

アプリケーションプロファイルの作成はどうですか? –

+0

このQはdupeのように見えます:http://stackoverflow.com/questions/3641983/export-a-global-symbol-from-a-delphi-dll –

+0

C++プログラムからグローバルをエクスポートすると、その名前は装飾されていますか。見つけ出すにはdumpbinかdependを使います。その後、同じ装飾をデルファイの輸出に適用します。 –

答えて

3

From what I've read Delphi does not support export of variables.

このステートメントは正しくありません。ここでデルファイ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 

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

+0

私は変数をOpenGLラッパーユニットに入れ、initilizationセクションにはMOV $ 1を置くことができました。私はそれ以外の場合はコンパイラによって無視されるということをどこかで読んでいます。 PEエクスプローラを実行すると、正しい名前と値1でエクスポートされます。残念ながら、私は私の目の前にオプティマスノートを持っていないので、明日までこれをテストすることはできません。しかし、私の問題のデルファイの部分は解決されているようだ。 – DelphiDabber

+0

asmをまったく使用する必要はありません。コンパイラはグローバル変数への書き込みを最適化しません。 –

+0

はい、輸出は、asmが NvOptimusEnablement:= $ 1;で置き換えられています。 – DelphiDabber

0

私はDelphiのエキスパートではありませんが、AFAIKではDelphiからCで実装された静的ライブラリにリンクすることは可能です。だから私はちょうどあなたのDelphiプログラムに静的にリンクされている、このエクスポートを提供するだけの小さなスタブライブラリを作成します。これにより、必要な輸出が追加されます。

+0

いいえ、静的ライブラリをリンクすることはできません。 –

+0

@DavidHeffernan:技術的には、これは後処理ステップでPEバイナリに適用されるべきものです。 GNU binutilsには、 "objcopy"と呼ばれるプログラムが含まれています。これはバイナリ操作に関するスイス軍ナイフのようなものです。 objcopyを使用して静的ライブラリを既存のPE .exeにコピーして、目的の効果を作り出すことができます。ちょうどアイデア。私はそれを試したことはありません、YMMV、それはショットの価値があるかもしれないと思う。 – datenwolf

+0

あなたの答えはまだかなり間違っています。事実上間違っています。また、グローバルに輸出するのも簡単です。コメントにあるリンクのように。 –

関連する問題