Stopwatch.GetTimeStamp 导致堆栈溢出错误?

发布于 2024-10-16 20:37:06 字数 1275 浏览 1 评论 0原文

如果我是正确的,那么在使用 Stopwatch.GetTimeStamp 时,我绝对不会遇到 stackoverflow 错误,尤其是在启动程序后。

这是我的代码:

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

由 Stopwatch.GetTimeStamp() 放置的 currentTicks 。这段代码位于一个名为“infinitely”的方法中(我用它来控制 FPS)。有人有什么想法吗?

编辑: 主窗体代码:

    Game game;

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

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

        MainLoop();
    }`

然后,Game 类:

    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。其他所有内容都无法评估。

If I'm correct, I should definitely not be getting a stackoverflow error while using Stopwatch.GetTimeStamp, especially only directly after starting my program.

Here's my code:

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

currentTicks being placed in by Stopwatch.GetTimeStamp(). This bit of code is in a method called infinitely (I'm using it to control FPS). Anybody have any ideas?

EDIT:
Main form code:

    Game game;

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

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

        MainLoop();
    }`

Then, the Game class:

    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;
        }
    }

It stops on "if (currentTicks >= lastTicks + interval)". I can see the value of currentTicks is 30025317628568. Everything else cannot be evaluated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

尬尬 2024-10-23 20:37:06

您正在递归地调用 MainLoop(又名 无限递归),这意味着您正在溢出调用堆栈。 GetTimeStamp 在这里是一个转移注意力的事情。

从内部删除对 MainLoop 的调用,只使用标准 while 循环:

while (game.DrawStuff(Stopwatch.GetTimestamp()))
{
    Invalidate();
}

You're calling MainLoop recursively (aka infinite recursion), which means that you're overflowing the call stack. GetTimeStamp is a red herring here.

Remove the call to MainLoop from within itself and just use a standard while loop :

while (game.DrawStuff(Stopwatch.GetTimestamp()))
{
    Invalidate();
}
画尸师 2024-10-23 20:37:06

我猜测发布的代码是名为 currentTickslastTicks 甚至 interval 的属性的 getter 的一部分。

因此,问题在于如何为属性使用适当的上限。

I'm guessing the posted code is part of the getter of a property callled currentTicks, lastTicks or even interval.

And so the question turns out to be about using proper Caps for properties.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文