13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GPU使用率の取得方法【C#】

Last updated at Posted at 2024-02-18

はじめに

こんにちは。
ジョジョ好きなXRクリエイターの もふるね です。

今回はCPU使用率をOSC通信でVRChatに送って、アバターの色を変化させてみたの続きです。

VRChatを遊ぶ際に、CPUとGPUのどちらに負荷がかかるのか疑問に思ったある日。
知人に聞くと、GPUの影響のほうが大きいらしい。
ふぅん、それならGPU使用率のデータを使って遊んでみたいな~。
それじゃ、GPU使用率を取得してみようっ!

結果

OSCを使ったアバターの色変化は前回の記事で解説してるから気になる人は見てくれよな!

GPU使用率の取得

取得方法を調べてみると、この記事が見つかった。
C# - Get total usage of GPU in percentage
どうやら、CPU使用率を取得したときと同様に、パフォーマンスカウンターを使うといいみたい。
取得方法は以下の通り

  • パフォーマンスカウンター内の"GPU Engine"というカテゴリーをリストに収納
  • リストから "entype_3D" という名前のついたものを抽出
  • 更に "Utilization Percentage" の名前のものを抽出(これでリストに100個くらいの数値が収納される)
  • 抽出された数値をすべて合計して導出された値が、GPU使用率だ!

コードで書くとこんなふう

using System.Diagnostics;

//パフォーマンスカウンターから[GPU使用率の計算に使う値]を抽出し、リストに入れる
var category = new PerformanceCounterCategory("GPU Engine");
var counterNames = category.GetInstanceNames();
var gpuCounters = counterNames
                    .Where(counterName => counterName.EndsWith("engtype_3D"))
                    .SelectMany(counterName => category.GetCounters(counterName))
                    .Where(counter => counter.CounterName.Equals("Utilization Percentage"))
                    .ToList();

//GPU使用率を計算
float result = 0.0f;
float tmpValue = 0.0f;
foreach (PerformanceCounter gpuCounter in gpuCounters)
{
    tmpValue = gpuCounter.NextValue();
    result += tmpValue;
}

//GPU使用率を出力
Console.WriteLine($"GPU使用率: {result}");

振り返り

抽出するときのプログラムの構文、
こんなの→ .Where(? => ?)
初めて見た。LINQってものらしい。
簡単に書けて便利だねぇ~
\テレレレー/(知識レベルが上がった!)

13
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?