Параллельно это как?
В одном из простых вариантов реализации игры делается примерно так. Создаётся главный цикл. Цикл запускает две функции: обновление данных и отрисовка кадра по этим данным. Каждый проход называется фреймом (Frame). За секунду цикл проходит по кругу несколько раз. Разница во времени между фреймами разное, поэтому необходим расчёт deltatime (хранящее или получающее время, прошедшее с последнего фрейма), которое используется при обновлении данных. Обновление данных также разветвляется на несколько функций, такие как обновление данных с контроллеров, обновление игровых данных и т.д. т.п. Одна из функций занимается тем, что вызывает у перемещаемых объектов (ботов и персонажа игрока) функции обновления положения (координат).
Боты и персонаж игрока перемещаются в зависимости от:
- deltatime (времени, прошедшего с последнего обновления перемещения);
- направления движения;
- расстояния за единицу времени.
Например так:
// если нажата кнопка вперёд
if(is_key_forvard_pressed) {
// direction меняется для направления вперёд
}
// если нажата кнопка вправо
if(is_key_right_pressed) {
// direction меняется для направления вправо
}
// изменение положения
if(is_move_active) {
location += direction * distance_per_sec * deltatime;
}
Распараллеливание выполнения некоторых процессов на потоки возможно, когда доступ к некоторым данным может иметь только один поток. Так, например, сначала изменяются данные для отрисовки и отправляются на отрисовку. Пока в одном потоке происходит отрисовка, в другом потоке подготавливаются новые данные для следующей отрисовки.