Время отслеживания в отладчике

[[РЕДАКТИРОВАТЬ 2x] Я думаю, что я неправильно сформулировал свой первоначальный вопрос, поэтому я выделил его ниже и переписал именно то, что я пытаюсь найти, для будущих читателей. ]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Новый, блестящий, ясный вопрос с лучшей формулировкой]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

У меня есть цикл, который работает для симуляции / игровой среды. В этом цикле есть несколько мест, где необходимо определить, сколько времени - на самом деле - прошло, чтобы логика в этих особых местах, в частности, рендеринг и обновление, могла работать правильно. Есть возможность быть фиксированным временным шагом (unfixed[update/render] ложно) или нет.

Проблема возникает, когда отладка на основе точек останова выполняется в любой точке приложения, поскольку она использует секундомер, чтобы выяснить, сколько прошло времени в реальном времени (для целей физики и анимации, движущихся с реалистичной скоростью, а не на основе того, сколько кадры, которые компьютер может выпускать).

Это выглядит (примерно) так, используяmultiple stopwatches for each 'part' of the application loop that needs to know how much time has passed since that 'part' last occurred:

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( );

    }
}   

Некоторая информация о переменных:

updatestopwatch этоСекундомер за время, проведенное вне функции Update (),

renderstopwatch этоСекундомер за время, проведенное вне функции Render (), и

gamestopwatch этоСекундомер за общее время, затраченное на симуляцию / саму игру.

Проблема возникает, когда я отлаживаю в любом месте приложения. Поскольку секундомеры измеряют в реальном времени, имитация будет полностью сброшена любым видом отладки на основе точек останова, потому что секундомеры будут продолжать отсчитывать время, независимо от того, выполняю ли я отладку приложения. Я не использую секундомеры для измерения производительности: я использую их для отслеживания времени между повторными появлениями обновления, рендеринга и другими событиями, подобными проиллюстрированным выше. Это очень расстраивает, когда я ставлю точку останова, анализирую и исправляю ошибку в Update (), но тогда время Render () настолько отключается, что любое отображение результатов симуляции мстительно бьет по лицу.

Тем не менее, когда я полностью прекращаю отладку, это, очевидно, не является проблемой, но у меня много работы по разработке, и я собираюсь отлаживать ее долгое время, поэтому просто притворяясь, что это не неудобно, не выиграю ». К сожалению, не работает. знак равно

Я посмотрел на счетчики производительности, но, похоже, не могу понять, как заставить их работать в контексте того, что я пытаюсь сделать: Render и Update могут содержать любое количество произвольного кода (они специфичны к любой симуляции работает поверх этогоwhile цикл), что означает, что я не могу делатьPerformanceCounter.Increment() для отдельных компонентов цикла.

Я буду продолжать ковыряться в System.Diagnostics и других пространствах имен .NET, но до сих пор я обнаружил пробелы в том, как просто «игнорировать». время, проведенное в прикрепленном отладчике ...

У кого-нибудь есть идеи или идеи?

[[РЕДАКТИРОВАТЬ 5x] Исправили орфографические ошибки и проверяли правильность форматирования на всем. Извини за это. ]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Оригинальный, менее ясный вопрос]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

У меня есть постоянный цикл, работающий в приложении C #, который я отлаживаю постоянно. В настоящее время я использую секундомер, но я мог бы использовать любой другой механизм для отслеживания времени прохождения. Моя проблема начинается, когда я делаю такие вещи, как использование точек останова где-то во время этого цикла (заключенный в типичнуюwhile (true) { ... }:

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

Время измеряет себя хорошо, но оно измеряет фактическое реальное время - в том числеany время я потратил на отладку. Это означает, что если я буду копаться в течение 17 секунд послеupdatestopwatch.Reset()это усложняется в моем цикле, и - по крайней мере, для 1 повторного запуска этого цикла - мне приходится иметь дело с дополнительным временем, которое я тратил в реальном времени, с учетом всех моих вычислений.

Есть ли способ, которым я могу подключиться к отладчику, чтобы узнать, когда оно замораживает приложение, чтобы я мог измерить время и вычесть его соответствующим образом? Как отмечалось, для этого я использую .NET и C #, но все, что связано с Visual Studio, также может помочь мне двигаться в правильном направлении.

[ РЕДАКТИРОВАТЬ ] Чтобы предоставить больше информации, я использую несколько секундомеров (для обновления, рендеринга и нескольких других событий в другой очереди сообщений). Если я установлю точку останова внутри Update () или в любой другой части приложения, секундомеры будут точно измерять реальное время, проведенное между ними. Это включает в себя время, которое я трачу на отладку различных совершенно не связанных компонентов моего приложения, которые называютсяUpdate() или жеRender() или жеInput() и т. д. Очевидно, что синхронизация моделирования (управляемая параметром GameTime, передаваемым в функции обновления, рендеринга и т. д. верхнего уровня) не будет работать должным образом, даже если ЦП потребовалось всего 13 мс для завершения функции обновления, я трачу13 extra seconds debugging (глядя на переменные, а затем продолжить симуляцию); проблема в том, что я увижу другие секундомеры, внезапно составляющие13 extra секунды времени. Если это все еще не имеет смысла, я включу снова.

Ответы на вопрос(3)

Ваш ответ на вопрос