以前も作っていた 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 のオーダーを変えるとコンパイルできるとかいてあったり、
今は毎日仕事から帰ってから、 学習してます。時々、申し訳ないですがお力添えお願いします。