#c# #.net #wpf #timer
#c# #.net #wpf #таймер
Вопрос:
Я пытаюсь создать небольшое приложение, похожее на игру, в котором есть некоторое взаимодействие, но для оценки игры требуется достаточно точное время.
Я видел некоторые версии java, использующие этот метод под названием System.nanoTime
.
Существует ли для этого .NET-версия?
Что еще более важно, я ищу какой-то таймер, который я мог бы использовать для оценки мира. Должен ли я использовать фактический элемент управления таймером и подписаться на него?
Кроме того, игра выполняется в потоке, отличном от потока пользовательского интерфейса. На всякий случай, если это что-то изменит.
Ответ №1:
DateTime.Now
не имеет фактического разрешения в диапазоне наносекунд. Тик — это «отрезок» времени в 100 наносекунд, но DateTime.Now
он не разрешает каждый тик. Я считаю, что самое низкое разрешение для DateTime.Now
составляет 10 миллисекунд или около того. Если вы вызовете DateTime.Now
дважды очень быстро, вы получите тот же ответ. Вы увидите, что оно запускается примерно через 10 миллисекунд или около того, в зависимости от того, в какой части цикла вы его вызываете.
Класс Stopwatch имеет более высокое разрешение, чем DateTime.Now
. Я полагаю, что это разрешится с точностью до миллисекунды, что, надеюсь, даст вам достаточное разрешение, чтобы определить, достаточно ли хорошо работает ваш код оценки игры. По предоставленной ссылке есть отличный пример, в котором противопоставляется секундомер и дата-время.
Кроме того, поле Frequency и метод getTimestamp могут использоваться вместо неуправляемых API Win32 QueryPerformanceFrequency и QueryPerformanceCounter.
Комментарии:
1. Класс stopwatch фактически будет использовать QueryPerformanceCounter под капотом, если он доступен (см. Поле IsHighResolution). Поэтому обычно не требуется использовать поле частоты и метод getTimestamp вручную.
2. @Gnafoo — Это то, что я пытался донести. Смысл сообщения заключался в том, что вам не нужно (не увидите пользы) использовать P / Invoke для kernal32.dll. Спасибо за ясность.
3. @Joan Venge — Вам нужно начать отмечать вопросы как отвеченные, иначе люди перестанут отвечать. Я думаю, что на данный момент есть несколько нерешенных вопросов.
4. @Dave: Я часто возвращаюсь назад и отмечаю их, но это зависит от того, какой метод дает мне желаемый результат. Я просто не хочу принимать что-то, когда я использовал другой метод. Это не было бы полезно для людей, которые нашли эти вопросы на SO, имея ту же проблему IMO.
5. Просто чтобы привести пример, прямо сейчас, например, я использую System. Многопоточность. Таймер, а не дата-время. Теперь, потому что это приближает меня к тому, что мне нужно, поскольку позволяет мне вызывать метод с определенными интервалами, как указано в моем вопросе.
Ответ №2:
Система.Многопоточность.Таймер имеет разрешение 1 мс. Если вам нужно более высокое разрешение, вы можете p / вызвать QueryPerformanceFrequency() и QueryPerformanceCounter() в kernel32.dll
Ответ №3:
Вы пробовали
DateTime.Now;
Это дает вам текущее время каждый раз, когда вы его вызываете. Вы могли бы получить его в двух разных точках и вычесть время окончания — начала для временного интервала.
Ответ №4:
Ну, есть DateTime.UtcNow
или DateTime.Now
. Однако для повторяющихся процессов вам следует использовать один из классов timer. Обычно для wpf используется DispatcherTimer
.
Ответ №5:
DateTime.Now.Ticks
сократит время до 100 наносекунд.
http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx
Ответ №6:
Используйте StopWatch
класс, он использует QueryPerformanceCounter внутри, так что у вас очень хорошее разрешение. Таким образом, вам не нужно выполнять pinvoke / interop.