跟踪调试器中花费的时间

5 .net c# breakpoints visual-studio-debugging

[[编辑2x]我认为我已经把我原来的问题写错了,所以我已经把它翻到了下面并重写了我想要的内容,以供将来的读者使用.]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[新的,有光泽的,清晰的问题,更好的措辞]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~

我有一个运行模拟/游戏框架的循环.这个循环有几个地方需要确定实际上已经过了多少时间,这样这些特殊地方的逻辑 - 特别是渲染和更新 - 才能正常工作.它可以选择是固定时间步(unfixed[update/render]是否为假).

当基于断点的调试在应用程序的任何一点完成时会出现问题,因为它使用秒表来计算实时已经过了多少(为了物理和动画以实际速度移动,而不是基于多少计算机可以生成的框架).

它看起来(粗略地)是这样的,对应用程序循环的每个"部分"使用多个秒表,需要知道自上次"部分"发生以来已经过了多少时间:

while ( RunningTheSimulation ) {
    /* ... Events and other fun awesome stuff */

    TimeSpan updatedifference = new TimeSpan( updatestopwatch.ElapsedTicks );

    if ( unfixedupdate || updatedifference > updateinterval ) {

        Time = new GameTime( updatedifference,
                                    new TimeSpan( gamestopwatch.ElapsedTicks ) );
        Update( Time );
        ++updatecount;
        updatestopwatch.Reset( );
        updatestopwatch.Start( );
    }

    TimeSpan renderdifference = new TimeSpan( renderstopwatch.ElapsedTicks );

    if ( unfixedrender || renderdifference > renderinterval ) {

        Time = new GameTime( renderdifference,
                                 new TimeSpan( gamestopwatch.ElapsedTicks ) );
        Render( Time );
        ++rendercount;
        renderstopwatch.Reset( );
        renderstopwatch.Start( );

    }
}   
Run Code Online (Sandbox Code Playgroud)

有关变量的一些信息:

updatestopwatch是一个秒表,用于在Update()函数之外花费的时间,

renderstopwatch是一个秒表,用于在Render()函数之外花费的时间,以及

gamestopwatch是一个秒表,用于模拟/游戏本身的总耗用时间.

当我在应用程序中的任何地方进行调试时出现问题.因为秒表是实时测量的,所以任何基于断点的调试都会完全抛弃Simulation,因为Stopwatches将继续计算时间,无论我是否正在调试应用程序.我没有使用秒表测量性能:我使用它们来跟踪重新发生更新,渲染和其他事件之间的时间,如上所示.当我在Update()中断点并分析并修复错误时,这会非常令人沮丧,但是Render()时间是如此完全关闭,以至于模拟结果的任何显示都是在脸上进行的.

也就是说,当我完全停止调试时,这显然不是一个问题,但是我有很多开发工作要做,而且我要调试很长时间,所以假装这不是不方便也行不通不幸的是.= [

我查看了性能计数器,但我似乎无法理解如何让它们在我正在尝试的环境中工作:渲染和更新可以包含任意数量的任意代码(它们是特定的无论模拟在这个while循环的顶部运行,这意味着我不能稳定地PerformanceCounter.Increment()为循环的各个组件做一个.

我将继续探讨System.Diagnostics和其他.NET命名空间,但到目前为止,我已经找到了关于如何"忽略"在附加调试器中花费的时间的空白......

任何人都有任何想法或见解?

[[EDITS 5x]修正了拼写错误,并确保所有内容的格式都正确无误.对于那个很抱歉.]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[原创,不太清楚的问题]
~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~

我在C#应用程序中运行了一个常量循环,我一直在调试它.我目前正在使用秒表,但我可以使用任何其他机制来跟踪传递时间.当我在这个循环期间在某处使用断点时,我的问题就开始了(包含在一个典型的while (true) { ... }:

if ( unfixedupdate || updatedifference > updateinterval ) 
{
    Time = new GameTime( updatedifference, 
                        new TimeSpan( gamestopwatch.ElapsedTicks ) );
    Update( Time );
    ++updatecount;
    updatestopwatch.Reset( );
    updatestopwatch.Start( );
}
Run Code Online (Sandbox Code Playgroud)

时间测量本身很好,但它测量实际实时 - 包括我花在调试上的任何时间.这意味着如果我在17秒之后徘徊updatestopwatch.Reset(),这会被复合到我的循环中 - 至少重新运行该循环 - 我必须处理我实时考虑所有计算的额外时间.

有没有什么方法可以挂钩调试器知道什么时候冻结应用程序,所以我可以反时间并相应地减去它?作为标记,我正在使用.NET和C#,但任何与Visual Studio相关的东西都可能有助于我朝着正确的方向前进.

[编辑]为了提供更多信息,我使用了几个秒表(用于更新,渲染和一些其他事件都在不同的消息队列中).如果我在Update()或应用程序的任何其他部分中设置断点,则秒表将准确测量它们之间的实时时间.这包括时间,我花调试这是所谓的下游我的应用程序的各种完全不相关的组件Update()Render()Input()等等.显然模拟的时序(通过传递到顶层更新GameTime参数控制,渲染等功能)将无法正常工作,如果,即使CPU只花了13毫秒来完成更新功能,我还要花13个额外的时间进行调试(查看变量然后继续模拟); 问题在于我会看到其他秒表突然占据了13秒的额外时间.如果它仍然没有意义,我会再次插话.

lep*_*pie 2

请改用性能计数器。进程 CPU 时间应该提供良好的指示(但不如实时秒表那么准确),并且不应干扰调试。