提问人:SpeedyGo55 提问时间:11/17/2023 更新时间:11/17/2023 访问量:41
为什么我的代码总是返回 100% CPU 负载和 0 MB 可用内存?
Why does my code always return 100% CPU load and 0 MB free ram?
问:
我想在 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";
}
}
答:
看起来您的代码中有几个问题可能会导致不正确的值。让我们浏览一下它们并进行必要的更正:
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 使用率可能具有挑战性。这些值可能不如预期的精确,您应该使用专用的分析工具以获得更准确的结果。
评论
NextValue
Update
评论