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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
#1

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

24.06.2012, 22:10. Просмотров 1940. Ответов 11
Метки нет (Все метки)

Здравствуйте уважаемые программисты! Подскажите пожалуйста как получить время в наносекундах.
Например в JAVA это делается вот так:
Java
1
long nanoTime = System.nanoTime();
А как в С++?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2012, 22:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как получить время в наносекундах (C++):

Как получить время в миллисекундах? - C++
Здравствуйте, пишу игру, до сего момента если что-то надо было переместить то я перемещал относительно каждого кадра, но вот если какой-то...

Как получить системное время и дату? - C++
В поиске искал и не нашел. Вопрос, значит, такой: Есть у меня допустим класс t_and_d и в него входят 2 переменные. в одну необходимо...

Как получить текущее время в формате чч:мм:сс - C++
Подскажите, есть необходимость получить текущее время в формате чч:мм:сс, как это реализовать?

Как получить время по Гринвичу, а не своего часового пояса? - C++
Задаю время примерно так: time_t seconds = 100000;//количество секунд с 1970г char buffer; struct tm timeinfo; ...

Как получить правильное местное время, используя функцию asctime и localtime? - C++
Друзья! Хочу видеть первое января 1970 года, одни ноли. Вместо этого упорно показывает 05:00:00, зачем мне эти 5 часов? Чётко сказано-...

Как можно получить дату и время создания файла и его объем? - C++
Здравствуйте! Скажите пожалуйста как можно получить дату и время создания файла и его объем. Задача такова, что мы создаем текстовый файл с...

11
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.06.2012, 22:16 #2
платформу указать необходимо. перформанс мерять, или еще что?
0
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
25.06.2012, 09:39  [ТС] #3
Пишу в Вижуал студио 2008 2Д игру используя библиотеки директ3Д. Мне нужно каждые 16,8 милисекунд выполнять код игры и перерисовывать экран, для этого достаточно узнать время в микросекундах. Есть функция timeGetTime(), но она дает время только в милисекундах. Неужели в С++ нельзя одной строчкой получить время в микро или наносекундах, это беда.
0
raxp
10163 / 6549 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
25.06.2012, 09:51 #4
...за нано забудьте, за микросекунды под виндой тоже можно забыть - это будет плавать в зависимости от процессора.
1
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.06.2012, 10:15 #5
Цитата Сообщение от The special one Посмотреть сообщение
Мне нужно каждые 16,8 милисекунд выполнять код игры и перерисовывать экран, для этого достаточно узнать время в микросекундах.
Это по часам не делается, перерисовку надо вызывать с каждого шага главного цикла, кроме транслирующих сообщения, не зависимо от того, сколько прошло времени.
1
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
25.06.2012, 10:15  [ТС] #6
Цитата Сообщение от raxp Посмотреть сообщение
...за нано забудьте, за микросекунды под виндой тоже можно забыть - это будет плавать в зависимости от процессора.
А как тогда люди игры делают под виндой? Я думаю способ есть.
0
raxp
10163 / 6549 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
25.06.2012, 10:23 #7
...взгляните на задачу с другой стороны: подсказку вам уже дали постом выше.
0
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 кадров в секунду). А рендеринг к этому не привязан и времени не получает. На домашних машинах и в интернет-клубах не ставят систем реального времени и нельзя ни каким кодом гарантировать, что какая то функция будет вызваться с чётким промежутком. Ну измерил ты. Дальше? Если время не подошло, ждёшь? Следующее измерение можешь сделать уже через два периода, а за текущий нафигачить пару тысяч замеров. Домашние системы в столь крупном масштабе времени ведут себя на столько не равномерно, что нельзя даже после поверки по счётчика вызовов функции по часам юзать этот счётчик для времени. На секундах кое как можно, на минутах можно вполне прилично, а меньше секунды нельзя.
1
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
25.06.2012, 10:28  [ТС] #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Это по часам не делается, перерисовку надо вызывать с каждого шага главного цикла, кроме транслирующих сообщения, не зависимо от того, сколько прошло времени.
Ну это вообще шок... или шутка неудачная. Если интервал между шагами главного цикла будет больше чем 16,8 милисекунд, то игра будет притормаживать. А если меньше - то программа не будет успевать выполнять код игры (вычислять новые координаты объектов). Игра будет многопользовательская и у каждого игрока перерисовка должна происходить строго через 16.8 мс.
0
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 Посмотреть сообщение
А если меньше - то программа не будет успевать выполнять код игры
Он будет меньше именно потому, что комп будет успевать исполнять код игры. И программа код не исполняет, она сама - код и её исполняют.
0
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
25.06.2012, 10:50  [ТС] #11
Я знаю есть игровой двиг написанный на С++ директикс, там можно установить любую частоту смены кадров (20, 60, 70, 120 кадров в секунду). И если я установил, например, частоту 72 кадра в секунду, то на разных компах с разными частотами процессоров игра будет перерисовывать сцену 72 раза в секунду (примерно, хотя я не проверял). Вот как они это сделали? Ладно, буду разбираться, всем спасибо за помощь.
0
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-ти ядерном маке, то и там тоже. Не смотря на кратную разницу в быстродействии. И время специально округлял до секунд. То есть единица измерения в десять раз больше периода требуемой частоты.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2012, 11:06
Привет! Вот еще темы с ответами:

Получить текущее время - C++
Столкнулся с такой проблемой. Нужно преобразовать результат, который возвращает time(0), в часы, минуты и секунды текущего дня. Для часов...

Получить системное время - C++
здравствуйте. как/с помощью какой функции можно полям своей структуры присвоить значения, соответствующих системным дате и времени?

получить из DateTimePicker UNIX-время - C++
Добрый день! Никак не могу получить время в Unix-формате. Для текущего времени и даты все вроде-бы довольно просто: time_t ltime =...

Получить время за которое выполнена задача - C++
Никак не пойму, тут в С++ всяких закорючек и приставок тьма... Вот как в переменную int записать результат в миллисекундах? ...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
25.06.2012, 11:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru