2011-03-06 67 views
2

阅读这些问题后:C#调试和释放.exe行为不同,因为长?

Code is behaving differently in Release vs Debug Mode

C# - Inconsistent math operation result on 32-bit and 64-bit

Double precision problems on .NET

Why does this floating-point calculation give different results on different machines?

我怀疑我的决定FPS方法的原因,其同时在调试模式不再起作用在发布模式下工作是因为我使用Long来保存时间值。以下是相关代码:

public void ActualFPS() 
    { 
     if (Stopwatch.GetTimestamp() >= lastTicks + Stopwatch.Frequency) 
     { 
      actualFPS = runsThisSecond; 
      lastTicks = Stopwatch.GetTimestamp(); 

      runsThisSecond = 0; 
     } 
    } 

runsThis每次调用我正在跟踪的方法时,它都会加1。当然这并不是一个确定FPS的非常准确的方法,但它适用于我所需要的。

lastTicks是一个Long类型的变量,我相信Stopwatch.GetTimestamp()返回的也是一个Long(?)。这是我的问题吗?如果是这样的话:关于如何解决这个问题的任何建议?

编辑:秒表使用高分辨率计时器。

编辑2:问题已经解决了。没有任何更改我的任何代码。完全一样。没有。我不知道是什么导致它突破或者自行修复。也许我的电脑决定自发地考虑我的感受?

+2

long是一个64位int,所以它不可能溢出。不过,我怀疑Stopwatch.GetTimestamp()可能使用低分辨率计时器,这意味着它具有10ms左右的粒度。 – 2011-03-06 05:38:56

+1

您链接的所有问题都是关于**浮点运算**。你的代码使用'Long'(或'Int64'),它是一个整数类型。完全不同的东西,不可能是同一个问题。 – 2011-03-06 05:43:15

+0

它使用高分辨率定时器。在615纳秒内准确。 – Bloodyaugust 2011-03-06 05:47:14

回答

3

您有一个非常准确的间隔测量可用(gettimestamp - lastticks),但您并未全部使用它来计算帧速率。你假设时间间隔是一秒钟,它不会。它会更多,随机数量取决于您调用ActualFPS()的频率。在发布模式中,您会更频繁地调用ActualFPS(),所以错误更少。

将runsThisSecond by(gettimestamp - lastticks)转换为秒。

+0

根据我的理解,时间间隔*由定义*为一秒,或者至少在一秒钟内有多少滴答。另外,我相当肯定,尽管发布模式运行得更快,但它不会导致每秒45帧的差异,尤其是因为一切似乎都以相同的速度运行(其中一部分是逐帧动画,这是相当可测量的)。我明白你在帖子中提出的建议,但是不会将“(gettimestamp - lastticks)”转换为秒,需要使用Stopwatch.Interval,你刚才建议的是随机调用ActualFPS()。 – Bloodyaugust 2011-03-07 05:07:00

相关问题