Время в игрокодинге
- Применяется в игрокодинге повсеместно.
- Является единицей измерения анимации.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 .Примечание
Для вызова функции 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;
Таким образом, записав время на любом этапе анимации и вычтя из него время начала, можно легко вычислить время, прошедшее с её начала.
Примечание
Для конвертации миллисекунд в секунды полученное значение надо разделить на 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