Как выполняется программирование на основе времени? - PullRequest
9 голосов
/ 14 октября 2010

Я не совсем уверен, каков правильный термин, но как создаются основанные на времени программы, такие как игры и симуляции? Я только что понял, что я только написал программы, которые ждут ввода, затем что-то делают, и поражен тем, что я понятия не имею, как бы я написал что-то вроде понга

Как будет кодироваться что-то вроде симулятора полета? Очевидно, он не будет работать так же быстро, как компьютер. Я предполагаю, что все выполняется по какому-то циклу. Но как вы справляетесь с этим, когда вычисление занимает больше времени, чем цикл.

Кроме того, каков правильный термин для этого? Поиск по «программированию на основе времени» действительно не дает мне полезных результатов.

Ответы [ 8 ]

17 голосов
/ 14 октября 2010

Игры делятся на симуляторы (решают, что появляется, исчезает или движется) и рендеринга (показывают это на экране, воспроизводят звуки). Симуляция разработана так, чтобы зависеть от времени: вы можете сказать, что симулятор "прошло 50 мс", и он будет вычислять симуляцию на 50 мс. Типичный игровой цикл рендерится (который занимает произвольное количество времени), а затем запускает симулятор в течение времени, прошедшего с момента последнего запуска симулятора.

  • Если код выполняется быстро, то шаги симулятора будут короткими (всего несколько мс), и игра будет рендерить сцену чаще.

  • Если код выполняется медленно, шаги симулятора будут иметь более длинные шаги и будет пропорционально меньше рендеров.

  • Если симулятор работает медленнее, чем сама симуляция (для расчета симуляции на 50 мс требуется 100 мс), игра не может быть запущена. Но это чрезвычайно редкая ситуация, и в играх иногда используются аварийные системы, которые снижают качество симуляции для повышения производительности, когда это происходит.

Обратите внимание, что зависимость от времени не обязательно означает точность на уровне миллисекунды. Некоторые системы реализуют моделирование с использованием основанных на времени функций (пройденное расстояние равно скорости, прошедшей с момента времени), в то время как другие выполняют этапы моделирования с фиксированной продолжительностью.

5 голосов
/ 14 октября 2010

Я думаю, что правильный термин - «Приложение в реальном времени».

По первому вопросу я отвечаю спонсору.Если вы знаете, сколько времени прошло между двумя кадрами, вы можете рассчитать (например, с помощью физики) новую позицию элементов на основе предыдущих.

3 голосов
/ 14 октября 2010

Есть два подхода к этому, у каждого есть свои преимущества и недостатки.

Вы можете перейти на основе кадров, в результате чего таймер сигнализирует n новые кадры каждую секунду. Вы рассчитываете движение просто путем подсчета прошедших кадров. Если вычисление превышает доступное время, игра замедляется.

... или, сохраняя концепцию фрейма, но на этот раз вы сохраняете абсолютную меру времени, а когда сигнализируется следующий фрейм, вы вычисляете движение мира по количеству прошедшего времени. Это означает, что все происходит в режиме реального времени, но в случае сильной нехватки ресурсов процессора игровой процесс становится прерывистым.

2 голосов
/ 14 октября 2010

Здесь вы можете изучить основы: http://www.gamedev.net/reference/start_here/

Почти все игры запрограммированы в архитектуре реального времени, а возможности компьютера (и, конечно, кодирование :)) определяют частоту кадров.

Программирование игр - действительно сложная работа, включающая моделирование объектов, скрипты, математические вычисления, быстрые и удобные алгоритмы рендеринга и некоторые другие вещи, такие как пиксельные шейдеры. Поэтому я бы порекомендовал вам проверить доступные движки в первую очередь. (Просто Google "бесплатный игровой движок")

Основная логика заключается в создании бесконечного цикла (while (true) {}), и цикл должен:

  • Слушайте обратные вызовы - здесь вы получаете сообщения о клавишах, мышах и системные сообщения.
  • Выполните физику из-за времени, прошедшего до предыдущего кадра, и пользовательских вводов.
  • Визуализация нового кадра (gdi, derictX или openGL)

Веселись

1 голос
/ 28 мая 2015

В принципе, есть 2 различных подхода, которые позволяют добавить анимацию в игру:

  • Анимация на основе кадров : прощепонять и реализовать, но имеет ряд серьезных недостатков.Подумайте об этом следующим образом: представьте, что ваша игра работает на скорости 60FPS , и вам нужно 2 секунды, чтобы нарисовать шарик, который перемещается с одной стороны экрана на другую.Другими словами, игре нужно 120 кадров для перемещения мяча по экрану.Если вы запускаете эту игру на медленном компьютере, который может рендерить только 30FPS , это означает, что через 2 секунды мяч будет находиться на в центре экрана .Таким образом, проблема этого подхода заключается в том, что рендеринг (рисование объектов) и моделирование (обновление позиций объектов) выполняются одной и той же функцией.

  • Анимация на основе времени : сложный подход, который отделяет код моделирования от кода рендеринга .Количество кадров в секунду, которое компьютер может отобразить, не влияет на количество движения (анимации), которое необходимо выполнить за 2 секунды.

Стивен Ламберт написал фантастическую статью об этих методах , а также о третьем подходе, который решает несколько проблем с анимацией на основе времени.

Некоторое время назад я написал приложение на C ++ / Qt, чтобы продемонстрировать все эти подходы, и вы можете найти видео прототипа, работающего здесь :

image

Исходный код доступен на Github .

1 голос
/ 14 октября 2010

Есть старая поговорка, что "часы - это актер". Основанные на времени программы являются программами, управляемыми событиями, но часы являются постоянным источником событий. По крайней мере, это довольно распространенный и достаточно простой способ ведения дел. Это падает, если вы делаете тяжелые вещи в реальном времени или очень высокопроизводительные вещи.

0 голосов
/ 07 ноября 2010

Flight Simulation - один из более сложных примеров моделирования в реальном времени.Понимание динамики жидкости, систем управления и численных методов может быть ошеломляющим.

В качестве введения в тему симуляции полета я рекомендую Создайте свой собственный симулятор полета на C ++ .Это из печати, но, кажется, доступно используется.Эта книга с 1996 года и ужасно устарела.Предполагается среда DOS.Тем не менее, он дает хороший обзор тем, охватывает числовую интеграцию, базовую механику полета и системы управления.Примеры кода являются упрощенными, достаточно полными и не предполагают более распространенных наборов инструментов, используемых сегодня для графики.Как и с большинством вещей, я думаю, что легче изучить предмет с более простой ссылкой.

Более продвинутый текст (выпускник колледжа, аспирантура первого года обучения): Принципы симуляции полета обеспечивает превосходное освещение широкого спектра тем, связанных с симуляцией полета.Эта книга станет отличным справочником для всех, кто серьезно интересуется симуляцией полета как инженерной задачей или для более реалистичной разработки игры.

0 голосов
/ 14 октября 2010

Поиск движения на основе времени даст вам лучшие результаты.

По сути, у вас либо есть цикл таймера, либо событие, запускаемое на обычных часах, в зависимости от вашего языка.Если это цикл, вы проверяете время и реагируете только каждую 1/60 секунды или около того.

Некоторые сайты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...