如果我是正确的,我应该肯定在使用Stopwatch.GetTimeStamp时不会出现堆栈溢出错误,尤其是在启动程序后才会出现。
这是我的代码:
if (currentTicks >= lastTicks + interval)
{
lastTicks = currentTicks;
return true;
}
currentTicks被Stopwatch.GetTimeStamp()放入。这段代码在一个无限调用的方法中(我用它来控制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.其他所有内容都无法评估。
答案 0 :(得分:4)
你正在递归地调用MainLoop(又名infinite recursion),这意味着你正在溢出call stack。 GetTimeStamp在这里是一个红鲱鱼。
从内部删除对MainLoop的调用,只使用标准while循环:
while (game.DrawStuff(Stopwatch.GetTimestamp()))
{
Invalidate();
}
答案 1 :(得分:3)
我猜测发布的代码是调用currentTicks
,lastTicks
甚至interval
的属性的getter的一部分。
所以问题是关于使用适当的Caps属性。