Пятница, 22 Ноября 2024, 08:49

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Игра целиком на видеокарте
puksus4Дата: Суббота, 25 Апреля 2020, 15:26 | Сообщение # 1
частый гость
Сейчас нет на сайте
В общем, есть вот этот проект, где автор взял и сделал игру целиком на видеокарте
Воть.

Ну и мне в общем-то понравилась идея, и с тех пор интересует, насколько возможно сделать игру типа mount and blade в режиме битвы или total war опять же чисто в режиме битвы, используя в основном видеокарту. Короче игру в которой есть дофига чуваков и они дерутся с применением тактики.
Ведь видюха неиллюзорно шустрее и если вместо ~500 чуваков на поле боя получить ~5000 - прям ваще огонь.

Собсно вот рассуждения на этот счёт, какие проблемы возникнут и как их решать.

1) Поиск пути
Не уверен как именно, но вот тут чуваки похоже умудрились запихнуть алгоритм А* на гпу. Но я уверен что грамотная реализация поиска пути не потребует GPU акселерации.
Ввести обязательное условие что на поле боя юниты ходят только группой, поиск пути для которых выполняется сразу для всех юнитов в группе. Групп может быть небольшое количество, при этом распределить поиск пути равномерно по кадрам. Столкновения же с другими юнитами, обход мелких препятствий и т.д. делать на самой видеокарте с помощью карты потенциальных полей, которую можно сгенерировать без проблем собственно на самой видеокарте. Хранить на ЦПУ карту мира в том или ином виде пригодную для поиска пути, будь то навигационные меши, сетка, чо угодно.

2) ИИ верхнего и среднего уровня
Алгоритмы ИИ анализирующие обстановку в игре с целью принятия тактических решений едва ли видятся возможным реализовать на ГПУ, но на счастье подобные вычисления вовсе не обязательно делать каждый кадр + данных для обсчёта не так много, можно превосходно делать этот обсчёт на ЦПУ, и слать на ГПУ буфера с указаниями что делать конкретным группам. Мораль солдат также обрабатываем тут. Смотрим сколько выживших в группе, сколько рядом союзников, сколько врагов, понижаем или повышаем мораль группы, и если она ниже плинтуса - делаем статус группе "бегство" и заставляем наш поисковик пути выдать путь подальше от поля боя. То есть индивидуальные юниты не бегут, бежит вся группа. Иначе пришлось бы для каждого бегущего солдата создавать отдельную группу, что крайне нежелательно с точки зрения производительности.

3) ИИ низкого уровня.
Если ИИ верхнего (тактика) и среднего уровня (решения группы юнитов) можно считать на цпу, то нижнего (ИИ отдельных болванчиков) уже нет смысла в рамках поставленной задачи т.к. в этом случае данных как раз много и некоторые решения нужно принимать быстро - нет возможности ждать. К тому же ИИ низкого уровня взаимодействует с другими элементами (анимации например), которые также обязаны хранить и обрабатывать на гпу. Допустим мы хотим чтоб юниты в игре вели себя по умному - умели атаковать, блокировать, как в mount and blade.

Во-первых юнит в группе не должен отходить слишком далеко от центра группы + должен подчиняться приказам сверху. Тойсть сначала смотрим какие обобщённые указания прилетели нам с ЦПУ, каков статус группы и учитываем это при обработке юнита.

Во-вторых, нам надо знать, какие вражеские солдаты находятся рядом. Это нужно для ближнего боя - определить цель атаки. Для этого можно юзать Спатиал Хеши (spatial hashes). Зарезервировать скажем, 10000 бакетов, хранение объектов в букетах можно организовать в виде списка, но без динамической памяти, просто на массивах. В самом букете храним первый объект, а в первом объекте идишник следующего. Если затруднительно обсчитать эту структуру прямо на гпу, объём данных не настолько большой (помним - 5000 юнитов на поле боя) чтоб это было критично для синхронизации и обработки на ЦПУ. К тому же это можно делать раз в 2-3 кадра или даже реже. Требуем чтоб объект не мог занимать более одного букета. Для этого вводим максимальный размер юнита и делаем чтоб ячейки нашей сетки перекрывали друг друга.
Таким образом имея эту структуру, для каждого юнита можно посмотреть ближайшие бакеты, выбрать набор из, скажем, 8 самых ближайших\приоритетных вражеских целей около юнита, смотрим что они делают. Если атакуют и мы в зоне поражения - блокируем. Иначе - пытаемся атаковать того кто к нам повёрнут спиной, или не блокирует и т.д. Также совершаем передвижения с целью занять выгодное положение относительно выбранных юнитов. А чтобы каждый кадр юнит не мотался как бешеный между разными целями - регулировать частоту смены решений, ввести пенальти на смену целей.

Для дальнего боя целевая группа противника будет обрабатываться на цпу в рамках ИИ среднего уровня. На гпу мы будем знать позицию группы, которую надо обстрелять. Соответственно смотрим букеты в некотором радиусе от центра группы (или берём рандомный в некотором радиусе в целях ускорения). По тому же принципу определяем конкретную цель обстрела - стреляем.

4) Анимации
Поскольку все объекты хранятся на гпу, и выбирают текущую анимацию на гпу, то и все анимации можно прекрасно хранить на гпу. Все матричные обсчёты костяных анимаций будут на гпу. Это значит, что скелеты болванчиков могут быть серьёзно детализированы. Можно отдельно обрабатывать каждый палец на руке каждого персонажа, просто каеф.

5) Звуки
Звуки на гпу мы воспроизводить не можем. Но мы можем завести буфер со звуковыми командами и аплодить его на цпу. Цпу просмотрит команды и начнёт воспроизведение нужных звуков.

6) Физика
Весь прикол в том, что физику обычно считают на цпу, поскольку результаты обсчёта физики обычно используются в игровой логике, а синхронизация ЦПУ с ГПУ может прибить всю производительность. ОДНАКО физику вполне можно считать на ГПУ. Яркий тому пример - nvidia PhysiX.
Также в репозитории Bullet Physics я видел код для гпу реализации физики. Так и не понял есчесно насколько он рабочий, в интернете инфы не нашёл. Но факт в том что физику можно делать на гпу. А что это значит? Правильно, в нашем случае это значит десятки тысяч объектов с физической симуляцией без просадки фпс.

7) Рендер
Ну, все объекты у нас уже на гпу, обрабатываем (ну там фрустум кулинг, разделение по материалам), собираем список, шлём на цпу, делаем индирект рендер.

8) Игрок
А чо тут делать-то? Считать ввод с клавиатуры, и синхронизировать объект игрока на цпу с объектом игрока на гпу. Нужно только идишник объекта на гпу знать.

9) Сеть
Если есть один игрок - то их может быть и тысяча. Вычисления всех игровых объектов, очевидно должно быть на сервере. Надо будет выдёргивать из гпу позиции объектов, воспроизводимые анимации и их прогресс, слать другим игрокам, принимать от них команды. Вероятно если какието геймплейные фичи влияют на рендер - их тоже надо выдёргивать. Рендер у клиентов локальный. Вообще конкретная реализация сети - отдельная тема и вряд ли сильно усложняется если игра на гпу.

Какие ещё могут возникнуть проблемы и как их можно решать?


Сообщение отредактировал puksus4 - Суббота, 25 Апреля 2020, 15:44
drcrackДата: Суббота, 25 Апреля 2020, 15:49 | Сообщение # 2
старожил
Сейчас нет на сайте
Цитата
Ведь видюха неиллюзорно шустрее и если вместо ~500 чуваков на поле боя получить ~5000 - прям ваще огонь.

Я все прочитал но так и не понял, зачем переносить на видюху вообще ВСЕ если можно перенести только то, что напрямую мешает перейти от 500 чуваков к 5000 (анимацию и тд)
Вот у чувака по ссылке реально уникальная игра и там по-другому никак, а тебе-то зачем этот гемор?
puksus4Дата: Суббота, 25 Апреля 2020, 18:04 | Сообщение # 3
частый гость
Сейчас нет на сайте
Цитата drcrack ()
зачем переносить на видюху вообще ВСЕ если можно перенести только то, что напрямую мешает перейти от 500 чуваков к 5000


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

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

Добавлено (25 Апреля 2020, 18:44)
---------------------------------------------
Да, название темы наверн не совсем верное Правильно будет чонибудь типа "частичная обработка игровой логики на ГПУ" или чота типа такого

Сообщение отредактировал puksus4 - Суббота, 25 Апреля 2020, 18:21
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг