以前も作っていた VRAM の使用量を量るソフトウェアがありましたが、今回は NVIDIA 限定で一番正確そうな取得方法を紹介します。
その方法は、 NVIDIA から公開されているライブラリである NVAPI を使用する方法です。この API セットの中に VRAM の情報を取得するものが含まれていました。取得するのも思いのほか簡単で、以下のように使用します。
// 初期化
NvAPI_Status nRet = NvAPI_Initialize();
NvU32 count = 0;
NvPhysicalGpuHandle hGpuHandles[NVAPI_MAX_PHYSICAL_GPUS] = { 0 };
NvAPI_EnumPhysicalGPUs( hGpuHandles, &count );
NvU32 physicalFBSize = 0;
NvPhysicalGpuHandle hGpuHandle = hGpuHandles[0];
NvAPI_GPU_GetPhysicalFrameBufferSize( hGpuHandle, &physicalFBSize );
bool isFinished = false;
do {
char buf[128];
NV_DISPLAY_DRIVER_MEMORY_INFO memoryInfo = { 0 };
memoryInfo.version = NV_DISPLAY_DRIVER_MEMORY_INFO_VER;
NvAPI_GPU_GetMemoryInfo( hGpuHandle, &memoryInfo );
sprintf_s( buf, "VRAM Info\n Using =%.1f (MB)\n sharedSysMem = %.1f (MB)\n",
(memoryInfo.availableDedicatedVideoMemory-memoryInfo.curAvailableDedicatedVideoMemory)/1024.0,
(memoryInfo.sharedSystemMemory/1024.0)
);
printf( buf );
OutputDebugStringA( buf );
Sleep(1000);
if( GetAsyncKeyState( VK_ESCAPE ) & 0x8000 ) {
isFinished = true;
}
} while( !isFinished );
// 終了
NvAPI_Unload();
使用中のサイズについては、本プロセスのものではなくシステム全体での使用量なので、ウィンドウを新規に開いたりするだけでサイズが変動します。本手法はメーカーが公開している API を使用して取得なので一番確実な値として使えるかなと思います。なにより DirectX や OpenGL といった描画系 API に依存していない点もよさそうです。

コメント
しょうもない質問でごめんなさい。 2x2のディスプレイでMosaicを使いたいのですが、画面をFlippedで使用できません。 そこでたどり着いたので NVAPIです。 NV_ROTATEというコマンドを使うらしいのですが、 NVAPI.h をどのPathに置いたらいいのでしょうか?
ご教授お願いします
NVAPI.h ヘッダおよび関連ライブラリはお使いの環境に合わせて、自由に配置場所を決めていいと思いますよ。
返信ありがとうございます。 Cでプログラミングするとのことも知りませんでした。 週末に サクッとCをみて、 minGW と visual studio code をそろえて
Cのcompileを30個くらいしました。 なんとなくCの使い方がわかってきたところで、 NvidiaのNvapiのサンプルをダウンロードして、 それを読みながら、 compileしましたが、 Errorだらけ。 どうやらNvapi.h のincludeにある指定が MinGWでは 使えないらしく。 Visual Studio でしなくてはだめなのかと。
まことに 申し訳ありませんが、 Nvapi64.lib と Nvapi.hはproperty.json のファイルに書き込みました。 どの Ccompilerが動作するかだけでも教えていただけないでしょうか?
自分は Visual Studio でやっていますね。 property.json とはなんでしょうか?
ありがとう。 VSの2015をdownloadしました。propery.jsonは私の書き間違いです。コンパイルするときに必要なファイルをc_ccp_properties.jsonというファイルに”includePath”: [“c:\\nvapi.hがあるフォルダ”,”C:\\mingw\\bin”,
と書くのかとどこかのSiteで見たもので、 私のような素人が手を出す領域ではないのをひしひし感じて、 でもやれるところまで進みます。
自分では書けなくても、 せめてNVIDIAが提供してるアンプルだけはコンパイルしたい。 海外のSiteでは、 MinGWではコンパイルできないと書いてあったり、#include のオーダーを変えるとコンパイルできるとかいてあったり、
今は毎日仕事から帰ってから、 学習してます。時々、申し訳ないですがお力添えお願いします。