はじめに
こんにちは。
ジョジョ好きなXRクリエイターの もふるね です。
今回はCPU使用率をOSC通信でVRChatに送って、アバターの色を変化させてみたの続きです。
VRChatを遊ぶ際に、CPUとGPUのどちらに負荷がかかるのか疑問に思ったある日。
知人に聞くと、GPUの影響のほうが大きいらしい。
ふぅん、それならGPU使用率のデータを使って遊んでみたいな~。
それじゃ、GPU使用率を取得してみようっ!
結果
GPU使用率をOSC通信でVRChatに送って、アバターの色を変化させてみた pic.twitter.com/nLKN1XN65Y
— もふるね𓇶 (@mofurune_k) February 14, 2024
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ってものらしい。
簡単に書けて便利だねぇ~
\テレレレー/(知識レベルが上がった!)