Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何读取系统使用情况(CPU、RAM等)_C#_Unity3d_.net 4.0 - Fatal编程技术网

C# 如何读取系统使用情况(CPU、RAM等)

C# 如何读取系统使用情况(CPU、RAM等),c#,unity3d,.net-4.0,C#,Unity3d,.net 4.0,在unity3d中,我试图读取系统使用情况,以便在一个人玩VR游戏时查看CPU和RAM的使用情况。我知道如何在电脑屏幕上显示它,以及如何让它远离玩家的虚拟现实屏幕 据我所知,我一直在谷歌搜索。他们中的大多数人给出了相同的答案,而我似乎无法正确地找到答案 我一直在查看帖子:这让我进入stackoverflow页面: 在这些帖子中,他们总是遇到CPU使用率停留在100%的问题,即使这是不正确的。我一直在尝试System.Threading.Thread.Sleep1000。但这会将整个游戏锁定为1f

在unity3d中,我试图读取系统使用情况,以便在一个人玩VR游戏时查看CPU和RAM的使用情况。我知道如何在电脑屏幕上显示它,以及如何让它远离玩家的虚拟现实屏幕

据我所知,我一直在谷歌搜索。他们中的大多数人给出了相同的答案,而我似乎无法正确地找到答案

我一直在查看帖子:这让我进入stackoverflow页面:

在这些帖子中,他们总是遇到CPU使用率停留在100%的问题,即使这是不正确的。我一直在尝试System.Threading.Thread.Sleep1000。但这会将整个游戏锁定为1fps,因为它每秒等待1秒。即使有1fps,我也只能读100%

在这段代码中,我使用的睡眠线程将游戏速度降低到1fps

using UnityEngine;
using System.Diagnostics;
using TMPro;

public class DebugUIManager : MonoBehaviour
{
    private PerformanceCounter cpuCounter;
    [SerializeField] private TMP_Text cpuCounterText;

    private void Start()
    {
        cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
    }

    private void Update()
    {
        cpuCounterText.text = getCurrentCpuUsage();
    }

    private string getCurrentCpuUsage()
    {
        dynamic firstValue = cpuCounter.NextValue() + "% CPU";
        System.Threading.Thread.Sleep(1000);
        dynamic secondValue = cpuCounter.NextValue() + "% CPU";

        return secondValue;
    }
}
每当我换衣服的时候

    private string getCurrentCpuUsage()
    {
        dynamic firstValue = cpuCounter.NextValue() + "% CPU";
        System.Threading.Thread.Sleep(1000);
        dynamic secondValue = cpuCounter.NextValue() + "% CPU";

        return secondValue;
    }

游戏不会在fps中被丢弃,但是它仍然没有做任何事情

我没有收到任何错误消息,因为它运行时没有问题。但我真的很想知道如何获得CPU使用率,这样我就可以自己计算出其余的


任何有帮助的答案都将不胜感激。

我尝试了这个,但也无法让PerformanceCounter正确运行,始终返回100%的结果

不过,我找到了一个很好的替代方案,并使用它重新构建了DebugUIManager

使用制度; 使用系统诊断; 使用System.Linq; 使用系统线程; 使用TMPro; 使用UnityEngine; 公共类调试管理器:MonoBehavior { [主要组成部分] [SerializeField]专用TMP_文本cpuCounterText; [校长设置] [工具提示应该更新CPU使用率的时间间隔?] [SerializeField]私有浮点更新Interval=1; [工具说明物理CPU内核的数量] [SerializeField]专用整数处理器计数; [头输出] 公开募股; 私有线程\u cpuThread; 私人浮动基金; 私人无效启动 { Application.runInBackground=true; cpuCounterText.text=0%CPU; //设置线程 _cpuThread=newthreadupdatecpu用法 { IsBackground=true, //我们不想让我们的测量线 //抢断表演 优先级=System.Threading.ThreadPriority.BelowNormal }; //启动cpu使用线程 _cpuThread.Start; } 私有void OnValidate { //我们只需要物理核心,但通常 //这将返回两倍的虚拟核心计数 // //如果这为您返回了错误的值,请将此方法注释掉 //并手动设置该值 processorCount=SystemInfo.processorCount/2; } 私人住宅 { //只是为了确保在这个对象被破坏时杀死线程 _cpuThread?中止; } 私有无效更新 { //为了提高效率,如果没有任何变化,请跳过 如果数学近似,则返回; //前两个值总是错误的 //直到_lastCpuTime正确初始化 //因此,只需忽略超出可能范围的值 如果CpuUsage<0 | | CpuUsage>100返回; //我对%使用了float而不是int,所以请使用您喜欢的ToString来显示它 cpuCounterText.text=CpuUsage.ToStringF1+%CPU; //更新_lasCpuUsage的值 _lasCpuUsage=CpuUsage; } /// ///在线程中运行 /// 私有void updatecpu使用 { var lastCpuTime=new TimeSpan0; //这是正常的,因为这是在后台线程中执行的 虽然是真的 { var cpuTime=new TimeSpan0; //获取此电脑中所有正在运行的进程的列表 var allprocesss=Process.getprocesss; //汇总所有运行进程的处理器总时间 cpuTime=allprocesss.AggregatecpuTime,current,process=>current+process.TotalProcessorTime; //获取处理器时间总和之间的差值 //上次我们打电话给这个 var newCPUTime=cpuTime-lastCpuTime; //更新_lastCpuTime的值 lastCpuTime=cpuTime; //我们寻找的值是差异,因此所有进程一起使用的处理器时间 //自从上次我们叫它除以我们等待的时间 //然后,由于性能可以选择在所有物理CPU上均匀分布 //我们还除以物理CPU计数 CpuUsage=100f*floatnewCPUTime.TotalSeconds/updateInterval/processorCount; //等待UpdateInterval Thread.SleepMathf.RoundToIntupdateInterval*1000; } } }
你可以用定时器。得到
计时器滴答的值。0.5秒或1秒将足够慢到1fps,因为每帧都会有1秒的等待时间。当使用协同程序执行设置的文本时,我现在让它等待1秒。现在它在0%上运行1秒,然后在100%System.Threading.Thread.Sleep1000上运行第二秒;将整个统一过程冻结1秒。。我想那不是你真正想要的。即使使用协同程序,也应该使用yield return new WaitForSeconds 1;相反为什么要在那里使用dynamic?很明显,你总是会得到一个字符串?你是想用var吗?谢谢,这帮了我很大的忙。现在我可能也能想出如何使用RAM和其他东西来实现这一点了。
    private string getCurrentCpuUsage()
    {
        return cpuCounter.NextValue() + "%";
    }