0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【VRChat】 OSCでPC使用率をチャットボックスに送信する

Last updated at Posted at 2024-12-29

はじめに

皆さん、VRChatをご存じですか?
VRChatとは、VR空間内で他ユーザーとの交流やイベントを楽しめる、ソーシャルVRプラットフォームです。しかし、私はVRChatを「エンジニアが自身の技術を存分に活かせる絶好の場」だと考えています。3Dモデリングやスクリプト制作、さらにはワールドの作成など、デジタル空間に自分のアイデアやクリエイティブを世界中のユーザーと共有できる場としても活用できると思いました。

今回の記事では、システムのリソース使用率(CPU、メモリ、GPU)を取得し、VRChatのチャットボックスに表示する方法をご紹介します。

システムの使用率を取得する

以下のPythonライブラリを使用します。

psutil:CPUとメモリの情報を取得

pynvml:GPU(NVIDIA)の情報を取得

python-osc:OSCを使ってVRChatにデータを送信

インストールが必要な場合は、以下のコマンドを実行してください。

pip install psutil pynvml python-osc

コード

以下が実際のプログラムです。このコードは、システム使用率を取得し、それをOSCプロトコルでVRChatに送信します。

from pythonosc.udp_client import SimpleUDPClient
import psutil
import time
from pynvml import nvmlInit, nvmlDeviceGetHandleByIndex, nvmlDeviceGetUtilizationRates, nvmlDeviceGetMemoryInfo

def get_system_usage():
    # CPU使用率
    cpu_usage = psutil.cpu_percent(interval=1)
    
    # メモリ使用率
    memory = psutil.virtual_memory()
    memory_usage = memory.percent  # メモリ使用率 (%)
    total_memory = memory.total / (1024**3)  # 総メモリ (GB)
    used_memory = memory.used / (1024**3)  # 使用中メモリ (GB)
    
    # GPU使用率 (NVIDIA)
    try:
        nvmlInit()
    
        # GPU0の情報を取得
        handle = nvmlDeviceGetHandleByIndex(0)
        utilization = nvmlDeviceGetUtilizationRates(handle)
        memory_info = nvmlDeviceGetMemoryInfo(handle)
        gpu_usages = {
            "gpu_usage": utilization.gpu,  # GPU使用率 (%)
            "memory_usage": utilization.memory,  # GPUメモリ使用率 (%)
            "total_memory": memory_info.total / (1024**3),  # 総GPUメモリ (GB)
            "used_memory": memory_info.used / (1024**3),  # 使用中GPUメモリ (GB)
        }
    except Exception as e:
        gpu_usages = f"Error retrieving GPU information: {e}"

    return {
        "cpu_usage": cpu_usage,
        "memory_usage": memory_usage,
        "total_memory": total_memory,
        "used_memory": used_memory,
        "gpu_usages": gpu_usages,
    }

if __name__ == "__main__":
    # OSC送信先(VRChatのデフォルトアドレスとポート)
    ip = "127.0.0.1"
    port = 9000
    client = SimpleUDPClient(ip, port)

    while True:
        usage = get_system_usage()
        
        usageFormat = (
            f"CPU Usage : {usage['cpu_usage']:.2f}%\n"
            f"Memory Usage : {usage['memory_usage']:.2f}%\n"
            f"Used Memory : {usage['used_memory']:.2f}/{usage['total_memory']:.2f}GB\n"
            f"GPU Usage : {usage['gpu_usages']['gpu_usage']}%\n"
            f"GPU Memory Usage : {usage['gpu_usages']['memory_usage']}%\n"
            f"Used Memory : {usage['gpu_usages']['used_memory']:.2f} / {usage['gpu_usages']['total_memory']:.2f}GB\n"
        )

        #チャットボックスに送信
        client.send_message("/chatbox/input", [usageFormat, 1])

        time.sleep(10)

コード解説

1. システム使用率の取得

CPU使用率: psutil.cpu_percent(interval=1) を使用。

メモリ使用率: psutil.virtual_memory() から詳細情報を取得。

GPU使用率: pynvml を使用してNVIDIAのGPU情報を取得。

2. OSCプロトコルを使用してVRChatに送信

SimpleUDPClient を使い、VRChatのデフォルトアドレス (127.0.0.1) とポート (9000) にデータを送信。

/chatbox/input エンドポイントを指定して、フォーマットした使用率情報を送信します。

3. 実行ループ

10秒ごとにシステムの使用率を取得し、更新されたデータをVRChatに送信します。

動作確認

よく見るとGPU Memory UsageとGPU Used Memoryの比率が一致していないです...
もしメモリの使用率を正確に把握したい場合は、used_memory / total_memory * 100の比率を自前で計算するほうが良いかもしれないです。

0
1
0

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?