質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

4088閲覧

C#からVRAMの値を取得したい

tokita.

総合スコア61

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/10/04 23:23

dxdiagを使うと、下画像のように搭載しているVRAMの値を取得することができます。
イメージ説明

この値(画像でいえば128MB)をC#で取得したいと思っています。
どのような方法がございますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

どのような方法がございますでしょうか。

dxdiagはコマンドラインオプションに/t/xを指定することで情報をファイルに出力することができるので、
![イメージ説明説明]

その出力したファイルから欲しい情報を取り出して出力することも簡単な方法のひとつです。/tオプションで出力されたファイルは例えば以下のような内容になります。

PlainText

1------------------ 2System Information 3------------------ 4 Time of this report: 10/5/2021, 09:11:51 5...省略 6 7Microsoft Graphics Hybrid: Not Supported 8 DirectX Database Version: 1.0.8 9 DxDiag Version: 10.00.19041.0928 64bit Unicode 10 11------------ 12DxDiag Notes 13------------ 14 Display Tab 1: No problems found. 15 Display Tab 2: No problems found. 16 Sound Tab 1: No problems found. 17 Sound Tab 2: No problems found. 18 Sound Tab 3: No problems found. 19 Input Tab: No problems found. 20 21--------------- 22Display Devices 23--------------- 24 Card name: AMD Radeon XX XXXXX 25 Manufacturer: Advanced Micro Devices, Inc. 26...省略 27 Display Memory: 10156 MB 28 Dedicated Memory: 2026 MB 29 Shared Memory: 8130 MB 30...

ここで、該当の情報「表示メモリ」は「Dedicated Memory: 2026 MB」の行に相当します。これを出力したテキストファイルから取り出せば良いです。以下、簡単なサンプルです。

C#

1using System; 2 3namespace ConsoleApp2 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 System.Diagnostics.Process process = new System.Diagnostics.Process(); 10 process.StartInfo.FileName = "dxdiag"; 11 process.StartInfo.Arguments = @"/t C:\_work\result.txt"; 12 process.StartInfo.UseShellExecute = false; 13 process.StartInfo.RedirectStandardOutput = false; 14 15 process.Start(); 16 process.WaitForExit(); 17 18 string[] lines = System.IO.File.ReadAllLines(@"C:\_work\result.txt"); 19 foreach (var line in lines) 20 { 21 if (line.Contains("Dedicated Memory:")) 22 { 23 // 必要なら行データを加工して出力 24 Console.WriteLine(line); 25 break; 26 } 27 } 28 } 29 } 30}

このプログラムを実行すると端末に「Dedicated Memory: 2026 MB」と出力します。キーワードとして利用する"Dedicated Memory:"はファイル中に何度も出現する場合があるので、ファイルの内容を良く理解してから使ってみてください。

投稿2021/10/05 00:41

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/10/05 00:47

尚、"/x"オプションを利用してXMLファイルで出力し、XPathを利用して選択的に該当の情報を取り出すのもよいかもしれません。(サンプルは最初、XMLファイル対応で試していましたが、普通のテキストファイルの方が良いかと思って提示は止めておきました)
Zuishin

2021/10/05 01:08

この方法なら簡単確実に画面と同じ値が得られますね。 最初、WMI かレジストリで簡単にわかるだろうと思っていて、実際その方法でも取得できることはありますが、メーカーによっては正しい値にならないということがわかった時点で却下しました。
dodox86

2021/10/05 01:15

Zuishinさんコメントありがとうございます。WMIの件は存じませんでしたので私も参考になります。 回答を投稿した後に「もしかしたら質問者さんはdxdiagは単に例として挙げただけで、dxdiagの表示項目のひとつである"表示メモリ"に該当する値を独自にC#のプログラムで取得したいのかな?」と思い直し、そうであれば私の回答は少し外したものになるのですが、最悪でもこの方法があると思い、そのままにしておきました。
tokita.

2021/10/05 01:26

回答ありがとうございます。 dxdiagに起動オプションがあることに全く気付いておらず大変勉強になりました。
guest

0

ベストアンサー

これでどうでしょう。
System.Management アセンブリ参照の追加、またはNugetからのインストールが必要です。

cs

1using (var searcher = new ManagementObjectSearcher( 2 "select * from Win32_VideoController")) 3{ 4 foreach (var obj in searcher.Get()) 5 { 6 Console.WriteLine($"AdapterRAM : {obj["AdapterRAM"]}"); 7 } 8}

Win32_VideoController クラス


[2021/10/8 追記]
DXGIを使用して情報を取得する事が出来るようなので、Vortice.DXGIで実験。
.NET5.0のサンプルソースです。

cs

1using System; 2using Vortice.DXGI; 3 4if (DXGI.CreateDXGIFactory1(out IDXGIFactory1 factory).Failure) 5{ 6 return; 7} 8 9using (factory) 10{ 11 for (int iAdapter = 0; ; iAdapter++) 12 { 13 if (factory.EnumAdapters(iAdapter, out IDXGIAdapter adapter).Failure) 14 { 15 break; 16 } 17 18 using (adapter) 19 { 20 if (adapter.Description.DedicatedVideoMemory == 0) 21 { 22 continue; 23 } 24 25 Console.WriteLine($"[adapter {iAdapter}]"); 26 Console.WriteLine($"Description:{adapter.Description.Description}"); 27 Console.WriteLine($"DedicatedVideoMemory:{adapter.Description.DedicatedVideoMemory / 1024 / 1024} MB"); 28 } 29 } 30}

(実行結果)
[adapter 0]
Description:NVIDIA GeForce GTX 1050 Ti
DedicatedVideoMemory:4018 MB
DxDiag結果

DxDiagの結果と一致します。

投稿2021/10/05 01:03

編集2021/10/07 17:53
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/10/05 01:09

私もこの方法を真っ先に試しました。 残念ながら、この方法ではメーカーによっては正しい値が取得できません。
退会済みユーザー

退会済みユーザー

2021/10/05 01:12

なるほど…ドライバーの実装によるんですかね。
tokita.

2021/10/05 01:18

回答ありがとうございます。 単位がbytesなことに気づかず、アレ?なんか違う、と一瞬思いましたが 最もスマートに取れました。
tokita.

2021/10/05 01:19

Zuishin様、コメントありがとうございます。 環境によって好ましくないとのこと承知いたしました。
tokita.

2021/10/05 01:37

「dxdiagは単に例として挙げただけで、dxdiagの表示項目のひとつである"表示メモリ"に該当する値を独自にC#のプログラムで取得したい」のがまさしくしたかったことで、 動作速度やファイル生成・削除の手間等考えますと、広く公開するものでないこともあり、「メーカーによっては正しい値が取得でき」ないことを考えても こちらの回答が私にとって最も必要なものでしたためBAにさせて戴きました。 ありがとうございました。
guest

0

Direct3D 12 プログラミング ガイド - Win32 apps | Microsoft Docs

directx でぐぐると引っかかります。
これらのDLLをC#で呼び出す形になります

#「C# directx」でぐぐってみよう

投稿2021/10/04 23:30

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/10/05 00:04

具体的にそのページのどこに書いてありますか? そもそも、本当に情報をみつけましたか? また、以前も指摘したおぼえがありますが、次の情報はどう考えていますか? https://docs.microsoft.com/ja-jp/windows/win32/direct3d12/directx-12-programming-environment-set-up > C++ は、Direct3D 12 の開発でサポートされている唯一の言語であり、C# やその他の .NET 言語はサポートされていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問