Форум программистов, компьютерный форум CyberForum.ru

Как получить время в наносекундах - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
24.06.2012, 22:10     Как получить время в наносекундах #1
Здравствуйте уважаемые программисты! Подскажите пожалуйста как получить время в наносекундах.
Например в JAVA это делается вот так:
Java
1
long nanoTime = System.nanoTime();
А как в С++?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.06.2012, 22:16     Как получить время в наносекундах #2
платформу указать необходимо. перформанс мерять, или еще что?
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
25.06.2012, 09:39  [ТС]     Как получить время в наносекундах #3
Пишу в Вижуал студио 2008 2Д игру используя библиотеки директ3Д. Мне нужно каждые 16,8 милисекунд выполнять код игры и перерисовывать экран, для этого достаточно узнать время в микросекундах. Есть функция timeGetTime(), но она дает время только в милисекундах. Неужели в С++ нельзя одной строчкой получить время в микро или наносекундах, это беда.
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
25.06.2012, 09:51     Как получить время в наносекундах #4
...за нано забудьте, за микросекунды под виндой тоже можно забыть - это будет плавать в зависимости от процессора.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.06.2012, 10:15     Как получить время в наносекундах #5
Цитата Сообщение от The special one Посмотреть сообщение
Мне нужно каждые 16,8 милисекунд выполнять код игры и перерисовывать экран, для этого достаточно узнать время в микросекундах.
Это по часам не делается, перерисовку надо вызывать с каждого шага главного цикла, кроме транслирующих сообщения, не зависимо от того, сколько прошло времени.
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
25.06.2012, 10:15  [ТС]     Как получить время в наносекундах #6
Цитата Сообщение от raxp Посмотреть сообщение
...за нано забудьте, за микросекунды под виндой тоже можно забыть - это будет плавать в зависимости от процессора.
А как тогда люди игры делают под виндой? Я думаю способ есть.
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
25.06.2012, 10:23     Как получить время в наносекундах #7
...взгляните на задачу с другой стороны: подсказку вам уже дали постом выше.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.06.2012, 10:26     Как получить время в наносекундах #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while (Message.message!=WM_QUIT)
 {
  if(PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))
  {
   TranslateMessage(&Message);
   DispatchMessage (&Message);
  }
  else
  {
   OldT=t;
   t=((double)clock())/((double)CLOCKS_PER_SEC);
   dt=t-OldT;
   Control.Refresh(dt);
   RenderView();
  }
Хотя в рефреш передаётся время, но там по часам выравнивается скорость перемещения персонажа, чем меньше прошло времени, тем меньше он должен сдвинуться, но обрабатывается любой промежуток времени, а не фиксированные 40 миллисекунд (25 кадров в секунду). А рендеринг к этому не привязан и времени не получает. На домашних машинах и в интернет-клубах не ставят систем реального времени и нельзя ни каким кодом гарантировать, что какая то функция будет вызваться с чётким промежутком. Ну измерил ты. Дальше? Если время не подошло, ждёшь? Следующее измерение можешь сделать уже через два периода, а за текущий нафигачить пару тысяч замеров. Домашние системы в столь крупном масштабе времени ведут себя на столько не равномерно, что нельзя даже после поверки по счётчика вызовов функции по часам юзать этот счётчик для времени. На секундах кое как можно, на минутах можно вполне прилично, а меньше секунды нельзя.
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
25.06.2012, 10:28  [ТС]     Как получить время в наносекундах #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Это по часам не делается, перерисовку надо вызывать с каждого шага главного цикла, кроме транслирующих сообщения, не зависимо от того, сколько прошло времени.
Ну это вообще шок... или шутка неудачная. Если интервал между шагами главного цикла будет больше чем 16,8 милисекунд, то игра будет притормаживать. А если меньше - то программа не будет успевать выполнять код игры (вычислять новые координаты объектов). Игра будет многопользовательская и у каждого игрока перерисовка должна происходить строго через 16.8 мс.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.06.2012, 10:45     Как получить время в наносекундах #10
А подход на основе частоты вызова функции хорош только при управлении оборудованием да в системах реального времени, целиком созданных только для управления оборудованием и подчинённых этой цели. В таких системах можно драйверный подход юзать даже в текстовом редакторе, так как там уже под управляющий софт сделан системный код, гарантирующий выделение со стабильной частотой фиксированных по длительности квантов времени. И на интервалах, измеряемых сутками. А игры так не делаются.

Добавлено через 9 минут
Цитата Сообщение от The special one Посмотреть сообщение
Если интервал между шагами главного цикла будет больше чем 16,8 милисекунд, то игра будет притормаживать. А
При большом интервале она так и так будет притормаживать, но именно так гарантируется максимум FPS. Я пробовал ещё на сотом пне сравнивать время. Без часов персонаж бил очередями по 5 000 выстрелов в секунду, прикрутил if, сравнивающий, не прошла ли с прошлого раза миллисекунда и с пяти тысяч уронил скорострельность где то тридцати-тридцати пяти выстрелов в секунду. А если не делать по часам единственный выстрел, а измерять время и фейкить соответствующее число выстрелов, то тогда можно добиться ровно килогерцовой очереди. Всё равно ведь ни кто не разглядит, одновременно десять пуль вылетели после паузы в 10 миллисекунд, или равномерно вылетали через каждую миллисекунду. Направления назначь индивидуальные одновременно вылетающим пулям, сфейкив для этого непрерывное вращение в течении интервала от предыдущего вызова и всё. Это главный цикл, чаще него ничего во всём первичном потоке делать нельзя.

Добавлено через 2 минуты
Цитата Сообщение от The special one Посмотреть сообщение
А если меньше - то программа не будет успевать выполнять код игры
Он будет меньше именно потому, что комп будет успевать исполнять код игры. И программа код не исполняет, она сама - код и её исполняют.
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
25.06.2012, 10:50  [ТС]     Как получить время в наносекундах #11
Я знаю есть игровой двиг написанный на С++ директикс, там можно установить любую частоту смены кадров (20, 60, 70, 120 кадров в секунду). И если я установил, например, частоту 72 кадра в секунду, то на разных компах с разными частотами процессоров игра будет перерисовывать сцену 72 раза в секунду (примерно, хотя я не проверял). Вот как они это сделали? Ладно, буду разбираться, всем спасибо за помощь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2012, 11:06     Как получить время в наносекундах
Еще ссылки по теме:

Как можно получить дату и время создания файла и его объем? C++
C++ Как получить время по Гринвичу, а не своего часового пояса?
Как получить текущее время в формате чч:мм:сс C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.06.2012, 11:06     Как получить время в наносекундах #12
Цитата Сообщение от The special one Посмотреть сообщение
Игра будет многопользовательская и у каждого игрока перерисовка должна происходить строго через 16.8 мс.
Ещё и сетка на сервачном рендере. А про пинги ты в курсе? А про пропускную способность сети? В зависимости от канала и расстояния вылезут даже пятисекундные паузы, а временами так вообще на любом канале в локалке будут паузы где то по секунде-две, а может и по пол минуты. Элементарно, пять компов, трое юзверей играют, а четвертый вдруг решил на пятный комп отправить файл в пару гигабайт и узким местом стал хаб, через который идёт твой трафик. И хорошо ещё, если на пятый, а не на игровой, тогда хоть можно поставить неблокирующий комммутатор, ему внутренней скорости хватит, чтоб пауза не возникла. А если на один из игровых, то упадёшь больше, чем на пять минут и выйдешь по тайм-ауту.

Добавлено через 14 минут
Цитата Сообщение от The special one Посмотреть сообщение
Я знаю есть игровой двиг написанный на С++ директикс, там можно установить любую частоту смены кадров (20, 60, 70, 120 кадров в секунду). И если я установил, например, частоту 72 кадра в секунду, то на разных компах с разными частотами процессоров игра будет перерисовывать сцену 72 раза в секунду (примерно, хотя я не проверял). Вот как они это сделали? Ладно, буду разбираться, всем спасибо за помощь.
Во-первых можно 72 раза в секунду, нельзя только через 1/72-ю секунды. Два кадра следуют через 1/72, потом третий через 1/144, а четвёртый через 3/144х. За секунду выравнивается на 71-73, но в пределах секунды могут быть паузы и по 2/72, а потом вдруг взлетит выше 144-х герц. 72 - это средняя, а ты пытаешься выровнять каждый интервал, что не возможно. А во-вторых на уровне кода 72 не задаются явно, а получаются и если на уровне интерфейса (считая таковым и API) частоту именно задать, то исполнить на незнакомой машине способен лишь адаптивный алгоритм и делается это не по часам, а детализацией, числом объектов и количеством шагов вперёд, на которые планируют боты. Задал эти параметры, измерил частоту, если не получилось, корректируешь, если ошибся в другую строну, то следующая коррекция не только имеет обратный знак, но и меньше по величине. А если коррекция дала эффект строго меньше половины разницы, по поводу которой выполнялась, то следующая коррекция больше. Я даже на квикбейсике сделал одну прогу, регулировавшую время исполнения пользовательской команды детализацией и расходовавшую примерно 100 миллисекунд на команду на любой машине. От 386-х и если сейчас откопать прогу и пустить на 12-ти ядерном маке, то и там тоже. Не смотря на кратную разницу в быстродействии. И время специально округлял до секунд. То есть единица измерения в десять раз больше периода требуемой частоты.
Yandex
Объявления
25.06.2012, 11:06     Как получить время в наносекундах
Ответ Создать тему
Опции темы

Текущее время: 22:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru