1

WinRTでゲームグラフィックスを実行するさまざまな方法を試しています。テストアプリが独自のCPU使用率を測定して表示できると便利なので、さまざまなアプローチ(ItemsControlと手動で画像を移動する方法とDirectX)を比較できます。 )。

本格的な.NETでは、 2つの既知の時点でProcess.TotalProcessorTimeを読み取り、デルタプロセッサ時間をデルタ時間で割った値(必要に応じてプロセッサ数に合わせて調整)を取得できます。アプリが完全に信頼されて実行されている場合は、 dwm.exeのProcessインスタンスを見つけて(GUIを画面に表示するという面倒な作業をすべて行うため)、それをCPU時間に追加することもできます。これは、ゲームグラフィックステストスイートのWinFormsおよびWPFバージョンで採用したアプローチです。

ただし、WinRTには、System.Diagnostics.Processクラスは存在しません。代替APIがある場合、どこでそれを探すべきかわかりません。

タスクマネージャーを開いて、最上位にとどまるように設定し、アプリの実行中に監視することができます。これは理想的とは言えません。(a)ウィンドウの一部を覆っているため、結果がわずかに歪んでいる可能性があります。(b)結果の集計またはログ記録を自分で行うことができません(たとえば、「10秒間の平均CPU使用率」)。したがって、CPU使用率をプログラムで取得できる方法がある場合は、柔軟性が追加されているという理由だけで、それをお勧めします。

WinRTアプリが独自のCPU使用率を判断する方法はありますか?

4

2 に答える 2

1

Windowsストアアプリ内からこの情報を取得するための「承認された」APIを知りません。

ただし、これをテストアプリでのみ実行する場合は、「未承認」のAPIを使用できます。承認されていないAPIを使用すると、プログラムはWACK認定に合格せず、ストアにアップロードできませんが、ローカルでテストする場合は問題ありません。未承認のAPIを呼び出す場合の保証はないため、動作は正式には定義されていませんが、少なくとも現在のリリースでは、多くの関数が正常に機能することに注意してください。

AllocConsole今年の夏の初めに書いた記事「Metroスタイルアプリでのprintfデバッグ」を呼び出す方法を示しました。P / Invokeを使用してネイティブ関数を呼び出すか、C#から呼び出すことができる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();
于 2012-09-09T14:04:34.917 に答える
0

残念ながら、少なくとも現時点では、WinRTにSystem.Diagnostics.Processクラスに相当するものはありません(System.Diagnostics.Processへの参照がなく、Win8 Metroスタイルアプリで他のプロセスにアクセスする)。一部のネイティブAPIはWinRTに公開されていますが(例については、 WinRTで論理CPUの数を取得するにはどうすればよいですか?)、リストが見つかりません。

于 2012-09-09T12:27:04.303 に答える