Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
int shootTimer = clock(); void tick() { if (shootTimer < clock()) { shootTimer += interval; shoot(); } }
* что означает вот эта фраза: «сильно загружают процессор, имеет смысл ограничить чатоту кадров, выполняя Sleep»?В конце каждого кадра выполнять функцию Sleep(x), таким образом частота кадров никогда не превысит 1000/x.
* «использования в игровом движке (а это значит, что помимо отмерения отрезков времени нам необходимо обеспечить работу событий, возникающих через заданное время)» как из одного следует другое?К примеру таймер для профайлинга по идее должен только замерять время выполнения конкретного участка кода. В то время как в играх всегда будут события, которые должны возникнуть через некоторое время (будь то конец уровня, или снятие наложенного проклятия с игрока, к примеру).
* «Самым логичным решением» почему? Нужно рассмотреть другие варианты, например: GetTickCount(), clock(), описать все плюсы и минусы.Поначитался геймдева да мсдн, везде для точного таймера рекомендовали именно эти функции
* странно использование плавающей арифметики, чем обусловлен такой выбор? Почему не целочисленная арифметика?Физика игры (даже простейшие движения по прямой) базируется на реальных физических законах скорость+ускорение во времени, поэтому числа с плавающей запятой больше подходят, как «более физические», т.е. мы можем описывать скорость в пикс./сек. исходя из того, что 1.0 = 1 секунда, и не используя более точное, но слишком абстрактное для данных условий число тиков
* «обратите внимание: время здесь не замеряется» почему?Дабы можно было вызвать эту функцию несколько раз, на каждом из которых результат был бы одинаков (если замерять каждый раз время, то оно, разумеется, будет течь между вызовами, и нарушится общая картина событий по таймеру). В моем движке время течет дискретно, на каждом тике все события, связанные со временем обновляются сразу и результат отображается на экран. Т.к. Время обновления таймера взято очень маленькое, визуально это смотрится как непрерывность.
теперь по поводу стрельбы:Насчет этого могу сказать лишь то, что доступно много и разных способов реализации, а у меня это сделано через менеджер событий из-за мой попытки отделить события по таймеру от всего остального, дабы классы оружия, менеджера оружий и игрока не хранили лишнюю информацию насчет времени и не обновляли ее (у меня только 2 раза используется взятие времени — для обновления физики, и для обновления событий). В будущем возможно пересмотрю позицию.
Все равно не понял. Попробую объяснить не понятно, что подразумевается под тем, что функция QueryPerformanceCounter загружает процессор. Если имеется в виду, что бесконечный цикл, нагружает процессор на 100 процентов, то причем тут QueryPerformanceCounter? Если же то, что на вызов QueryPerformanceCounter затрачивается много времени, то причем тут Sleep?В мейнлупе если останутся только обработчики сообщений — будет нормальная нагрузка на процессор. Если же туда добавить тяжелых функций типа QueryPerformanceCounter — загрузка будет 100%, слип будет давать возможность другим процессам пользоваться процессорным временем. Насчет того, что будет, если убрать только таймер, оставив все остальное в цикле, ничего не могу сказать, не пробовал, и пока что нет возможности попробовать (нахожусь вдали от компилятора), но разницы это не сделает — таймер нужен, и только он уже грузит на 100% (ибо с таймера начинал движок писать и эта проблема как раз и возникла).
в таком случае я вообще не вижу смысла в этом классе, т.к. тебе достаточно синхронизировать кадры, а все остальное будет базироваться на константе дельта t. Вся эта морока, с измерением разницы и т.д. и т.п.Мы не до конца поняли друг друга: я имел в виду, что отрезки времени дискретны, но имеют разную длину, т.е. событие «через 0.5 секунды» выполняется не через 0.5 секунды (непрерывное время), а через 0.5+х секунд, где х зависит от величины последнего временного отрезка. Например, если временные отрезки будут следующие: 0.1, 0.2, 0.3, то событие выполнится только через 0.6 секунд. Проще говоря, дельта t не константа.
Основы создания игрового движка: таймер