8

診断として、アプリに1秒あたりのサイクル数を表示したいと思います。(一人称シューティングゲームでは1秒あたりのフレーム数を考えてください。)

ただし、最新の値、またはリリース以降の平均を表示したくありません。計算したいのは、最後のX値の平均です。

私の質問は、これらの値を保存するための最良の方法についてだと思います。私が最初に考えたのは、固定サイズの配列を作成することでした。そのため、新しい値ごとに最も古い配列がプッシュされます。これはそれを行うための最良の方法ですか?もしそうなら、私はそれをどのように実装しますか?

編集: これが私が書いたクラスです:RRQueue。キューを継承しますが、容量を強制し、必要に応じてデキューします。

編集2: Pastebinはとてもパスです。今GitHubリポジトリにあります。

4

5 に答える 5

16

このための最も簡単なオプションは、おそらく、を使用するQueue<T>ことです。これにより、先入れ先出しの動作が提供されます。アイテムをEnqueue()するだけで、X個を超えるアイテムがある場合は、余分なアイテムをDequeue()します。

于 2010-06-22T20:36:28.743 に答える
1

最速の実装が必要な場合は、はい、個別のカウントを持つ固定サイズの配列()が最速になります。

于 2010-06-22T20:39:30.827 に答える
0

Windows に組み込まれているパフォーマンス監視を確認する必要があります:D。

MSDN

API を使ったことがない場合、API は少し不安定に感じるかもしれませんが、高速で、強力で、拡張可能で、すぐに使用可能な結果を​​得ることができます。

于 2010-06-22T21:48:59.320 に答える
0

私の実装:

class RoundRobinAverage
{
    int[] buffer;
    byte _size;
    byte _idx = 0;
    public RoundRobinAverage(byte size)
    {
        _size = size;
        buffer = new int[size];
    }

    public double Calc(int probeValue)
    {
        buffer[_idx++] = probeValue;
        if (_idx >= _size)
            _idx = 0;

        return buffer.Sum() / _size;
    }
}

利用方法:

private RoundRobinAverage avg = new RoundRobinAverage(10);\
...
var average = avg.Calc(123);
于 2017-06-02T10:20:34.530 に答える