15

C++/CLI アダプターを使用して C# アプリケーションから使用される c++ で記述された OpenGL ライブラリがあります。私の問題は、Nvidia Optimus テクノロジを搭載したラップトップでアプリケーションを使用すると、アプリケーションがハードウェア アクセラレーションを使用せずに失敗することです。

Nvidiaのドキュメントhttp://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdfにある情報を使用しようとしましたしかし、それは失敗します。.exeにリンクされた.dllではなく、.exeで何かをしなければならないと思います

nvidia ハードウェアが使用されていることを確認する必要があるため、プロファイルを使用することは適切なオプションではありません。

C# アプリケーションで Optimus に統合 Intel チップセットの代わりに Nvidia チップセットを使用させる方法はありますか?

4

5 に答える 5

2

ソフトウェアが Intel で失敗すると、50% のラップトップで実行できなくなります。したがって、代わりにこれを修正することをお勧めします。

言われているよりも、コードで完全にプロファイルを作成できます。NvAPIを使用するだけです。このコードはまさにこれを行いますが、注意してください。おそらく、グローバル プロファイルを台無しにして、代わりに独自のプロファイルを作成しないでください。

NvAPI_Status status;
// (0) Initialize NVAPI. This must be done first of all
status = NvAPI_Initialize();
if (status != NVAPI_OK) 
    PrintError(status, __LINE__);
// (1) Create the session handle to access driver settings
NvDRSSessionHandle hSession = 0;
status = NvAPI_DRS_CreateSession(&hSession);
if (status != NVAPI_OK) 
    PrintError(status, __LINE__);
// (2) load all the system settings into the session
status = NvAPI_DRS_LoadSettings(hSession);
if (status != NVAPI_OK) 
    PrintError(status, __LINE__);
// (3) Obtain the Base profile. Any setting needs to be inside
// a profile, putting a setting on the Base Profile enforces it
// for all the processes on the system
NvDRSProfileHandle hProfile = 0;
status = NvAPI_DRS_GetBaseProfile(hSession, &hProfile);
if (status != NVAPI_OK) 
    PrintError(status, __LINE__);


NVDRS_SETTING drsSetting1 = {0};
drsSetting1.version = NVDRS_SETTING_VER;
drsSetting1.settingId = SHIM_MCCOMPAT_ID;
drsSetting1.settingType = NVDRS_DWORD_TYPE;

NVDRS_SETTING drsSetting2 = {0};
drsSetting2.version = NVDRS_SETTING_VER;
drsSetting2.settingId = SHIM_RENDERING_MODE_ID;
drsSetting2.settingType = NVDRS_DWORD_TYPE;

NVDRS_SETTING drsSetting3 = {0};
drsSetting3.version = NVDRS_SETTING_VER;
drsSetting3.settingId = SHIM_RENDERING_OPTIONS_ID;
drsSetting3.settingType = NVDRS_DWORD_TYPE;

if( ForceIntegrated ){
    drsSetting1.u32CurrentValue = SHIM_MCCOMPAT_INTEGRATED;
    drsSetting2.u32CurrentValue = SHIM_RENDERING_MODE_INTEGRATED;
    drsSetting3.u32CurrentValue = SHIM_RENDERING_OPTIONS_DEFAULT_RENDERING_MODE | SHIM_RENDERING_OPTIONS_IGPU_TRANSCODING;
}else{
    drsSetting1.u32CurrentValue = SHIM_MCCOMPAT_ENABLE;
    drsSetting2.u32CurrentValue = SHIM_RENDERING_MODE_ENABLE;
    drsSetting3.u32CurrentValue = SHIM_RENDERING_OPTIONS_DEFAULT_RENDERING_MODE;
}



status = NvAPI_DRS_SetSetting(hSession, hProfile, &drsSetting1);
if (status != NVAPI_OK) 
    PrintError(status, __LINE__);

status = NvAPI_DRS_SetSetting(hSession, hProfile, &drsSetting2);
if (status != NVAPI_OK) 
    PrintError(status, __LINE__);

status = NvAPI_DRS_SetSetting(hSession, hProfile, &drsSetting3);
if (status != NVAPI_OK) 
    PrintError(status, __LINE__);

// (5) Now we apply (or save) our changes to the system
status = NvAPI_DRS_SaveSettings(hSession);
if (status != NVAPI_OK) 
    PrintError(status, __LINE__);
// (6) We clean up. This is analogous to doing a free()
NvAPI_DRS_DestroySession(hSession);
hSession = 0;

起動時に、プロファイルが存在するかどうかをテストします。そうでない場合は、作成します (おそらく、自分自身も再起動する必要があります)。NvAPI は静的ライブラリであり、NVIDIA 以外のハードウェアでは正常にエラー コードを返すため、安全に出荷できます。

編集:もっと簡単な方法があるようです。GLFW 3 ソースコードから:

// Applications exporting this symbol with this value will be automatically
// directed to the high-performance GPU on nVidia Optimus systems
//
GLFWAPI DWORD NvOptimusEnablement = 0x00000001;
于 2013-06-24T13:46:44.547 に答える
0

ドキュメントからは、かなり単純なようです。それを行う方法は複数あります。残念ながら、dll ではなく、exeがそれを行う必要があります。このチュートリアルによると、次のようなことができるかもしれません:

class OptimusEnabler {
    [DllExport("NvOptimusEnablement")]
    public static int NvOptimusEnablement = 1;
};

次に、これを C++ ライブラリ インターフェイスに含める必要があります。これにより、これを使用するすべての C# アプリケーションがこれを強制的にエクスポートできるようになります。または、次のリンクを試すこともできますnvapi.dll

class OptimusEnabler {
    [DllImport("nvapi.dll")]
    public static extern int NvAPI_Initialize();
};

ドキュメントによると、これはアプリケーションを NV 対応として認識するのにも十分なはずです。インポートされた関数を呼び出す必要すらありません。

于 2014-05-20T11:26:06.023 に答える