0

私が正しければ、 Stopwatch.GetTimeStampの使用中に、特にプログラムを開始した直後にのみ、stackoverflowエラーが発生することはありません。

これが私のコードです:

if (currentTicks >= lastTicks + interval)
        {
            lastTicks = currentTicks;
            return true;
        }

Stopwatch.GetTimeStamp()によって配置されるcurrentTicks。このコードは、無限に呼び出されるメソッドに含まれています(FPSを制御するために使用しています)。誰かアイデアはありますか?

編集:メインフォームコード:

    Game game;

    public Form1()
    {
        InitializeComponent();
        game = new Game(Stopwatch.Frequency / 45);
        MainLoop();
    }

    public void MainLoop()
    {
        if (game.DrawStuff(Stopwatch.GetTimestamp()))
        {
            Invalidate();
        }

        MainLoop();
    }`

次に、ゲームクラス:

    public long lastTicks { get; set; }

    public double interval { get; set; }

    public Game(double Interval)
    {
        interval = Interval;
    }

    public bool DrawStuff(long currentTicks)
    {
        if (currentTicks >= lastTicks + interval)
        {
            lastTicks = currentTicks;
            return true;
        }

        else
        {
            return false;
        }
    }

「if(currentTicks> = lastTicks +interval)」で停止します。currentTicksの値は30025317628568であることがわかります。それ以外はすべて評価できません。

4

2 に答える 2

4

MainLoopを再帰的に呼び出しています(別名無限再帰)。これは、呼び出しスタックがオーバーフローしていることを意味します。GetTimeStampはここでは赤いニシンです。

MainLoopの呼び出しをそれ自体から削除し、標準のwhileループを使用します。

while (game.DrawStuff(Stopwatch.GetTimestamp()))
{
    Invalidate();
}
于 2011-02-11T08:04:49.330 に答える
3

currentTicks投稿されたコードは、lastTicksまたはと呼ばれるプロパティのゲッターの一部であると推測していintervalます。

したがって、問題は、プロパティに適切なキャップを使用することに関するものであることがわかります。

于 2011-02-10T19:08:53.527 に答える