Загрузка...
 
Печать

Время в игрокодинге

  • Применяется в игрокодинге повсеместно.
  • Является единицей измерения анимации.1

Язык: C++ . Платформа: Win32



Время в анимациях

Анимация в игрокодинге может быть:
  • скелетной,
  • интерполированной,
  • текстурной.
У любой анимации есть время:
  • начала (start time),
  • окончания (end time),
  • промежуточных участков (in-between action).
Время позволяет измерять, как долго длится анимация, начиная с начала.
Измерение времени (timing) очень важен в анимациях по многим причинам. Во времена ОС MS DOS компьютеры проигрывали анимацию так быстро, как могли. И до определённого времени всех всё устраивало. Но к 2000 году средняя частота процессоров в домашних ПК подошла к отметке 400 Мгц и все игры с подобными DOS-анимациями стали воспроизводиться со скоростью в 5-10 раз быстрее, чем были изначально задуманы. На CD-сборниках с DOS-играми часто присутствовала специальная утилита-замедлитель частоты центрального процессора (CPU slower). Но подобные "костыли" совершенно не годились для современных игр рубежа веков.
Для решения данной проблемы применили время. Ведь время течёт с постоянной скоростью (в принципе во всех BIOS-часах ПК). Одна секунда - она и в Африке одна секунда. Поэтому привязав анимации ко временным промежуткам, игрокодер будет уверен, что она воспроизведётся на любом (достаточно производительном) компе ровно так, как он задумал.

Измерение времени средствами MS Visual C+ + . Функция timeGetTime

Существует множество способов, которыми программер может измерить время в приложении. В DirectX 9 такие функции отсутствуют. Но в данной статье мы применим функцию timeGetTime, которая идёт в базовой библиотеке MS Visual C++ ещё со времён Win3.1 .
Закрыть
noteПримечание

Для вызова функции timeGetTime необходимо директивой #include подключить заголовок windows.h (или windowsx.h). В недрах установленной MS Visual C++ должна также присутствовать специальная библиотека winmm.dll. В бесплатных Express-версиях этой IDE winmm.dll нет. В этом случае её (winmm.dll) можно отдельно скачать с Интернета и добавить в настройках Решения/Проекта в разделе "Дополнительные зависимости" (Additional Dependencies).

Функция timeGetTime возвращает значение типа DWORD, отображающее время в миллисекундах, прошедшее с момента начала работы (= входа в учётную запись) ОС Windows. Администраторы сетей на базе ОС Windows называют это значение "startup time". Само это значение нас мало интересует. Но если его применить в качестве счётчика, мы сможем измерять относительное время, прошедшее с начала анимации. Вот пример вызова функции timeGetTime:
DWORD StartTime = timeGetTime();

Как только получили (в принципе любое) числовое значение времени стартапа ОС, её можно вызвать ещё раз, но чуть позднее. Вычтя более позднее значение из более раннего получим отрезок времени в миллисекундах:
DWORD ElapsedTime = timeGetTime() - StartTime;

Таким образом, записав время на любом этапе анимации и вычтя из него время начала, можно легко вычислить время, прошедшее с её начала.
Закрыть
noteПримечание

Для конвертации миллисекунд в секунды полученное значение надо разделить на 1000. Пример: TimelnSeconds = TimeInMilliseconds/1000;
Для обратной конвертации значение в секундах умножают на 1000.


Применение функции timeGetTime для представления времени анимации в виде скалярного значения

Степень того, как долго выполняется анимация, можно также представить в виде скалярного числа. Эта метода во многом схожа с процентным выражением. Здесь число 0 обычно соответствует началу анимации. 1 - концу. Все промежуточные значения выражаются в виде десятичной дроби. Например, половине анимационного времени будет соответствовать значение 0.5. Скалярное значение вычисляется по след. формуле:
Scalar = CurrentTime / (EndTime - StartTime)

Источники


1. Thorn A. DirectX 9 graphics: the definitive guide to Direct3D. - Wordware Publishing, 2005


Последние изменения страницы Воскресенье 19 / Июнь, 2022 13:01:27 MSK

Последние комментарии wiki

No records to display

Search Wiki Page

Точное совпадение

Категории

|--> C#
|--> C++