为什么我的代码总是返回 100% CPU 负载和 0 MB 可用内存?

Why does my code always return 100% CPU load and 0 MB free ram?

提问人:SpeedyGo55 提问时间:11/17/2023 更新时间:11/17/2023 访问量:41

问:

我想在 unity 中使用 C# 获取 CPU 负载和 RAM 负载(如果可能的话,还可以获取 GPU 负载)。我的代码总是说我的 CPU 处于 100% 负载,我的 RAM 总是有 0MB 可用空间。为什么会这样,我该如何解决这个问题?如果可能的话,我怎样才能额外获得GPU负载?

我使用了我在几个网站上找到的几样东西,并确定了一个没有给我错误的代码,并输出了一些稍作调整的东西。唯一的问题是我总是返回 100% 的 CPU 负载和 0MB 可用内存。我检查了任务管理器和值,其中 ~20% 和 2.4 GB 可用。 法典:

using UnityEngine;
using System.Collections;
using System.Diagnostics;

public class LoadMeasure : MonoBehaviour {
    
    //PerformanceCounter cpuCounter;
    //PerformanceCounter ramCounter;
    System.Diagnostics.PerformanceCounter cpuCounter;
    System.Diagnostics.PerformanceCounter ramCounter;
    
    
    void Start() {
        System.Diagnostics.PerformanceCounterCategory.Exists("PerformanceCounter");
        
        cpuCounter = new PerformanceCounter();
    
        cpuCounter.CategoryName = "Processor";
        cpuCounter.CounterName = "% Processor Time";
        cpuCounter.InstanceName = "_Total";
    
        ramCounter = new PerformanceCounter("Memory", "Available MBytes");
    }
    
    void Update(){
        UnityEngine.Debug.Log("> cpu: "+getCurrentCpuUsage()+"; >ram: "+getAvailableRAM());
        
    }

    public string getCurrentCpuUsage(){
                return cpuCounter.NextValue()+"%";
    }

    public string getAvailableRAM(){
                return ramCounter.NextValue()+"MB";
    } 
}
C# unity-game-engine 加载

评论

1赞 wohlstad 11/17/2023
这可能与此相关(来自 Unity 论坛):PerformanceCounters 在 Unity 中返回 0MB RAM 和 %100 CPU

答:

-1赞 Engr. Md. Muslim Uddin Arju 11/17/2023 #1

看起来您的代码中有几个问题可能会导致不正确的值。让我们浏览一下它们并进行必要的更正:

1. 性能计数器的初始化:PerformanceCounterCategory.Exists(“PerformanceCounter”);line 没有任何用途,也不会创建计数器类别的实例。您应该将其删除。

2. 采样率:性能计数器需要一些时间来收集准确的数据。在当前实现中,您将在初始化计数器后立即调用 NextValue()。这可能会导致读数不准确。您应该在调用 NextValue() 之前引入延迟。

下面是代码的更新版本:

using UnityEngine;
using System.Diagnostics;
using System.Threading;

public class LoadMeasure : MonoBehaviour
{
private PerformanceCounter cpuCounter;
private PerformanceCounter ramCounter;

void Start()
{
    cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
    ramCounter = new PerformanceCounter("Memory", "Available MBytes");
}

void Update()
{
    // Introduce a delay before sampling again
    Thread.Sleep(1000);

    UnityEngine.Debug.Log("> cpu: " + getCurrentCpuUsage() + "; >ram: " + getAvailableRAM());
}

public string getCurrentCpuUsage()
{
    // Call NextValue twice to get a valid reading
    cpuCounter.NextValue();
    return cpuCounter.NextValue() + "%";
}

public string getAvailableRAM()
{
    return ramCounter.NextValue() + "MB";
}
}

此代码在记录 CPU 和 RAM 使用情况之前引入了 1000 毫秒(1 秒)的延迟。此外,为 CPU 计数器调用 NextValue() 两次有助于获得更准确的读数。

请记住,由于 Unity 的工作方式和现代处理器的多线程特性,在 Unity 中准确测量 CPU 使用率可能具有挑战性。这些值可能不如预期的精确,您应该使用专用的分析工具以获得更准确的结果。

评论

0赞 derHugo 11/19/2023
你的整个第 2 点都是错误的。OP 不是立即调用,而是调用一帧。 在 Unity 中每帧调用一次。在此处添加一秒(或任何值)的强制冻结将冻结整个 Unity 应用程序和编辑器,并强制其以每秒最多 1 帧的速度运行NextValueUpdate