我用不同的方式做游戏显卡在WinRT的实验,并且它会是不错的,如果我的测试应用程序可以测量并显示自己的CPU使用率,这样我就可以比较不同的方法(ItemsControl的与周围的手动运动图像对比的DirectX )。
在完全成熟的.NET,我可以读Process.TotalProcessorTime在时间上两个已知点,然后取增量处理器时间由增量时间划分(调整如果需要的处理器的数量)。 如果应用程序在完全信任的运行,我甚至可以找到Process实例dwm.exe (因为它把屏幕上的图形用户界面的所有繁重的任务),并添加到我的CPU时间。 这是我参加了我的WinForms和WPF版本的做法游戏图形测试套件 。
但在WinRT中的类的System.Diagnostics.Process不存在。 如果有一个备用API,我不知道到哪里寻找它。
我可以打开任务管理器,并设置它留在上面,只是留意它作为我的应用程序运行。 这是不太理想的,因为(一)它涵盖了我的窗口的一部分,因此可能歪斜的业绩略; 和(b)我不能做任何我自己成果的聚集或记录(如“这里是CPU的平均利用率超过十秒钟的跨度”)。 所以,如果有一些方法我能得到我的CPU使用编程方式,我会更喜欢,只是因为增加了灵活性它给了我。
有没有什么办法了WinRT的应用程序,以确定自己的CPU使用率?
我不知道任何“认可”的API从Windows商店应用中获取此信息。
但是,如果你只是想这样做的一个测试应用程序,你可以用“未经批准”的API。 如果您使用的是不批准的API,你的程序将无法通过WACK认证,并不能上传到商店,但是出于测试本地没关系。 请注意,有没有保证,当你调用的API未经批准,所以其行为正式不确定,但是很多功能,做工精细 - 至少在当前版本中。
我演示了如何调用AllocConsole
的文章中,我今年夏天早些时候写道,在“在Metro风格应用程序的printf调试” 。 你可以从C#类似的东西,或者使用P / Invoke来调用本机的功能,也可以通过写C ++ Windows运行时组件,可以从C#调用。
对于你的情况,我建议你打电话GetCurrentProcess
让手柄到当前进程,并把它传递给GetProcessTimes
来获取用户和内核时间。 我跑了一个简短的测试,并得到了这种方法合理的妆效。
下面是一个使用P / Invoke来拨打电话一个完整的C#类:
static class DebugProcessTimes
{
[StructLayout(LayoutKind.Sequential)]
private struct FileTime
{
public UInt32 Low;
public UInt32 High;
}
private static UInt64 ToUInt64(FileTime time)
{
return ((UInt64)time.High << 32) + time.Low;
}
[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetProcessTimes(
IntPtr hProcess,
out FileTime lpCreationTime,
out FileTime lpExitTime,
out FileTime lpKernelTime,
out FileTime lpUserTime);
public struct ProcessTimes
{
public UInt64 CreationTime;
public UInt64 ExitTime;
public UInt64 KernelTime;
public UInt64 UserTime;
}
public static ProcessTimes GetProcessTimes()
{
FileTime creation, exit, kernel, user;
if (!GetProcessTimes(GetCurrentProcess(),
out creation, out exit, out kernel, out user))
throw new Exception(":'(");
return new ProcessTimes
{
CreationTime = ToUInt64(creation),
ExitTime = ToUInt64(exit),
KernelTime = ToUInt64(kernel),
UserTime = ToUInt64(user)
};
}
}
用法:
var times = DebugProcessTimes.GetProcessTimes();
不幸的是,没有在WinRT中的的System.Diagnostics.Process类的等价物,至少目前没有( 缺少参照的System.Diagnostics.Process并在Win8的Metro风格的应用程序访问其他进程 )。 一些原生API暴露的WinRT(见我怎样才能在WinRT的逻辑CPU的数量?为例),但我不能找到一个列表。