forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   RTS game loop (http://forum.boolean.name/showthread.php?t=19836)

Igor 09.05.2015 16:16

RTS game loop
 
Пытаюсь понять, как сделать игровой цикл в стретегии с огромным количеством юнитов на карте (как минимум 1к не должно тормозить на телефоне, а лучше 8к и больше). Есть следующие ограничения:
  1. течение игрового времени не зависит от fps и прочих сюрпризов типа сборщика мусора на 30мс
  2. повторяемость. В идеале - разбить игру на "тики", и получить возможность при тех же входных данных получить ровно те же результаты.
  3. длинный тик: есть опасения, что каждый кадр или чаще обновлять состояние каждого юнита не получится - их много, да и аккумулятор экономить надо.
В итоге у меня сформировалась следующая идея:
мир обновляется около пяти раз в секунду, следующее состояние мира детерминировано вычисляется на основе предыдущего состояния и пользовательских действий:
state(x+1) = f(state(x), input)
Поскольку время вычисления следующего состояния может оказаться больше, чем время обновления экрана, я разбиваю карту на куски и первым делом рассчитываю тот кусок, который видит пользователь, и на основе старой и новой позиции юнитов p0 и p1 интерполирую промежуточную как p0 + (p1-p0)*t

Кто пробовал писать rts, поделитесь опытом: как бы вы это сделали?
Какая задержка при отдаче команд юнитам заметна? Тут не старкрафт, несколько сотен раз в минуту в экран тыкать осмысленно вряд ли можно.

Samodelkin 09.05.2015 17:00

Ответ: RTS game loop
 
Опыта разработки RTS нет, но первое что приходит в голову это разделить юнитов стоящих и идущих/сражающихся. Я думаю что вторых в разы меньше, а первых обновлять не надо или очень редко. Предложение с кусками карты, которые видит пользователь, тоже дельное, но я думаю сложнее и его реализовывать надо после выше предложенного. Ещё вроде как в Total War обрабатываются отряды целиком, какими то общими формулами, а если на него смотрит пользователь, то исходя из состояния отряда генерируются отдельные юниты и их действия. По этой причине движок Total War не может симулировать современные сражения, где нет отрядов.

Nex 09.05.2015 17:37

Ответ: RTS game loop
 
Спустя 4 года отвечаю еще раз.

Цитата:

Сообщение от Igor (Сообщение 178639)
В этой игре как-то очень хитро сделали туман, так как игра не тормозила при 500 и больше юнитов на компах тех времён.
Как они это сделали? Только сейчас задумался...

Цитата:

Сообщение от Nex (Сообщение 178672)


Igor 09.05.2015 19:23

Ответ: RTS game loop
 
Цитата:

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

Evgen 12.01.2017 22:12

Ответ: RTS game loop
 
Цитата:

Сообщение от Nex (Сообщение 295746)
Спустя 4 года отвечаю еще раз.

Алгоритм похож на тот же что и в земле онимодов

https://astralax.ru/articles/pathway

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

Пример алгоритма приближения:

Код:

if(xtarget>xpos)xpos++;
if(xtarget<xpos)xpos--;
if(ytarget>ypos)ypos++;
if(ytarget<ypos)ypos--;

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

А вообще тема разработки RTS очень объемная, там очень много всяких алгоритмов.


Часовой пояс GMT +4, время: 13:16.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot