Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » Multithreading в играх | страница 1
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 1 из 3
На страницу: 1, 2, 3  След. | Все страницы
Поиск в этой теме:
Канал Игры Мечты: «Multithreading в играх»
Guest
 2075 EGP


Модератор
Рейтинг канала: 5(167)
Репутация: 376
Сообщения: 27975
Откуда: Моск.
Зарегистрирован: 12.10.2004
Полуабстрактная тема на поговорить о многопоточности в играх.

Просто интересно: какие части игрового движка в общем случае вы можете предложить запараллелить?
Hard mode: с учётом того, что синхронизация всего состояния нужна каждый кадр.
_________________
Трещит земля как пустой орех
Как щепка трещит броня
    Добавлено: 04:39 14-12-2015   
Vostok-1
 155 EGP


Репутация: 24
Сообщения: 394

Зарегистрирован: 15.08.2015
У меня обычно в отдельном потоке сидит отрисовка, в другом - логика. Но я мобильщик, у пс/приставок наверняка своё видение будет.
_________________
"The gods do not protect fools.
Fools are protected by more capable fools."

Larry Niven
    Добавлено: 08:00 14-12-2015   
ТехноМаг
 360 EGP


Рейтинг канала: 2(19)
Репутация: 93
Сообщения: 2513
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Vostok-1 :
в отдельном потоке сидит отрисовка, в другом - логика.


Очень хороший подход, который Конами активно использовали в конце 90ых начале тысячных. При правильном использование лагов не будет даже, если железо не тянет графику.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 11:19 14-12-2015   
Minx
 987 EGP


Модератор
Рейтинг канала: 6(329)
Репутация: 135
Сообщения: 10533
Откуда: Gomel, Belarus
Зарегистрирован: 19.11.2005
Guest :
Minx :
То ли квалификации не хватает (события и нити не проходили?), то ли собрать однопоточно по-быстрому проще, то ли ещё что.

Высокая связность мешает. Следующий тик картинки жёстко связан со следующим тиком логики. Ну и race condition, хотя это про квалификацию скорее.

Синхронизация по тикам (cyclic executive) есть следствие конкретных архитектурных решений и единственно верным путем не является. Есть например reactive systems, когда система реагирует на конкретные события. Противоположностью тикам считаются priority executive, когда есть много возникающих задач с разными приоритетами, и более высокий приоритет приостанавливает более низкий (подробности сравнения можно посмотреть например тут).

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

Guest :
Просто интересно: какие части игрового движка в общем случае вы можете предложить запараллелить?

В качестве примера (но не движка). Берем E: D, задача расчета маршрута на 1000 ly. Реализовано таким образом, что на время расчета система становится колом и, если повезет, можно нажать мышой на какую-нибудь кнопку. При этом из 4-х ядер у меня два плюют в потолок. Что сложного в этой задаче? Создали нить, передали параметры, потом перехватили по событию. Никаких race, пару потоковых примитивов, стартовали и словили, а лучше ещё таймаут повесили (которого нет кстати). И в этой задаче по-хорошему, нужно определить кол-во свободных ядер и распараллелить задачу, потому как пользователю ждать вместо 10 секунд 5 или 2.5 намного комфортнее.
_________________
μηδείς αγεωμέτρητος εισίτω

Последний раз редактировалось: Minx (14:50 14-12-2015), всего редактировалось 2 раз(а)
    Добавлено: 13:55 14-12-2015   
Guest
 2075 EGP


Модератор
Рейтинг канала: 5(167)
Репутация: 376
Сообщения: 27975
Откуда: Моск.
Зарегистрирован: 12.10.2004
ТехноМаг :
Vostok-1 :
в отдельном потоке сидит отрисовка, в другом - логика.


Очень хороший подход, который Конами активно использовали в конце 90ых начале тысячных. При правильном использование лагов не будет даже, если железо не тянет графику.

А вот тут я хочу взять примером реализацию такого подхода в VRage (Space Engineers). Там случается очень неприятная ситуация, когда поток логики виснет (уходит в бесконечный цикл и становится unresponsive), а поток отрисовки продолжает работать по последним полученным от логики данным. Для ОС программа продолжает работать. Для пользователя - висит. Средства ОС не позволяют завершить такую программу автоматически по событию "не отзывается". Фактически, ОС вообще не видит ничего плохого... Гы-гы

добавлено спустя 23 минуты:
Minx :
В качестве примера

Пример хороший, хотя я думал немного про другое. Если появляется задача, которая действительно отвязана от игровых событий, и которую можно безболезненно перезапустить с новыми параметрами в любой момент (игрок ткнул в другую систему) - то да, отдельный поток. А что касается постоянно крутимых задач?
_________________
Трещит земля как пустой орех
Как щепка трещит броня

Последний раз редактировалось: Guest (16:47 14-12-2015), всего редактировалось 1 раз
    Добавлено: 16:47 14-12-2015   
Vostok-1
 155 EGP


Репутация: 24
Сообщения: 394

Зарегистрирован: 15.08.2015
Guest :
А вот тут я хочу взять примером реализацию такого подхода в VRage (Space Engineers). Там случается очень неприятная ситуация, когда поток логики виснет (уходит в бесконечный цикл и становится unresponsive), а поток отрисовки продолжает работать по последним полученным от логики данным. Для ОС программа продолжает работать. Для пользователя - висит. Средства ОС не позволяют завершить такую программу автоматически по событию "не отзывается". Фактически, ОС вообще не видит ничего плохого... Гы-гы


Я в одной игре для j2me выводил в отдельный поток расчёт кратчайшего пути (волна). В силу некоторых оптимизаций он работал изрядно медленнее, зато ему требовалось памяти в среднем на 60% меньше. Если добавить к такому потоку вотчер, вполне можно жить.

Guest :
А что касается постоянно крутимых задач?


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

Или же, если важна очерёдность, можно конвейер слепить. Когда ставится в поток несколько задач (1,2,3,4,5) и начинают решаться, а супервайзер идёт по этим потокам, ожидая, пока не завершится очередной фрагмент. Если какие-то задачи решаются "через шаг", на их место можно ставить новые.
_________________
"The gods do not protect fools.
Fools are protected by more capable fools."

Larry Niven
    Добавлено: 17:12 14-12-2015   
Minx
 987 EGP


Модератор
Рейтинг канала: 6(329)
Репутация: 135
Сообщения: 10533
Откуда: Gomel, Belarus
Зарегистрирован: 19.11.2005
Guest :
А что касается постоянно крутимых задач?

Например reactive system как постоянно крутимая задача.

Пользователь зашел в главное меню игры. Система ждет, пока он нажмет одну из менюшек. Параллельно нужно рисовать немного красивых шейдеров.
Нить немного рисует шейдеров, опрашивает устройства, перерисовывает мышь-клаву, засыпает на 1/25 сек, и так по кругу. В результате - процессор отдыхает.

Теперь чуть сложнее. Игрок играет по сети и хочет чего-нибудь исправить в настройках. Нажимает Esc и залазит в менюшки. Хочется, чтобы игрок мог краем глаза видеть происходящее в игре (а не так, как сделано в E: D (; ). Т.е. ставится новая задача-нить, которая занимается менюшками (по технологии выше). Старая задача-нить живет своей жизнью, её делаем например потемнее и потише, но ещё ей понижаем приоритет (превед priority executive! задача пусть потормозит, её не жалко, но в меню процессор большую часть времени отдыхает, как мы выяснили выше).
_________________
μηδείς αγεωμέτρητος εισίτω

Последний раз редактировалось: Minx (19:13 14-12-2015), всего редактировалось 1 раз
    Добавлено: 19:11 14-12-2015   
Guest
 2075 EGP


Модератор
Рейтинг канала: 5(167)
Репутация: 376
Сообщения: 27975
Откуда: Моск.
Зарегистрирован: 12.10.2004
Minx :
Игрок играет по сети

и
Minx :
но ещё ей понижаем приоритет

в реал-таймовой игре не приведёт к рассинхрону состояния для сервера и других игроков?
_________________
Трещит земля как пустой орех
Как щепка трещит броня
    Добавлено: 19:35 14-12-2015   
Minx
 987 EGP


Модератор
Рейтинг канала: 6(329)
Репутация: 135
Сообщения: 10533
Откуда: Gomel, Belarus
Зарегистрирован: 19.11.2005
Guest :
в реал-таймовой игре не приведёт к рассинхрону состояния для сервера и других игроков?

Рисование фона и синхронизация с сервером это же разные задачи.

В системах с приоритетами одна из самых проблем это расставление приоритетов (; Если архиважна синхронизация с сервером, то её как раз таки можно оформить отдельной нитью с более высоким приоритетом.

Мы так для систем критичных к безопасности делали. Когда для работы по сети писался отдельный модуль, который проектировался так что не мог зациклится в принципе (это даже доказывалось на уровне формальных методов, но для игр это совсем не обязательно я думаю), завершался за очень малое время (менее 1% загрузки CPU), и далее на него вешали высокий приоритет. В результате практически идеальные показатели времени реакции на связь, а основные задачи жили своей жизнью.
_________________
μηδείς αγεωμέτρητος εισίτω
    Добавлено: 20:01 14-12-2015   
Sh.Tac.
 151 EGP


Рейтинг канала: 5(108)
Репутация: 14
Сообщения: 1426

Зарегистрирован: 27.07.2005
горя не знаю с тех пор как открыл для себя MPSC схему (несколько производителей, один потребитель) и потокобезопасные контейнеры с условной переменной, которые усыпляют тред потребителя пока пусты

использую только задачно-ориентированные треды, они же постоянные "крутилки" aka сервисы, никаких тред-пулов

правда для рендерера и физики такое не канает, это молотилки очень чувствительные к интервалу обновления

добавлено спустя 3 минуты:
З.Ы. еще звук туда же
_________________
This is what you get ...
(c) Radiohead

Последний раз редактировалось: Sh.Tac. (04:21 15-12-2015), всего редактировалось 1 раз
    Добавлено: 04:21 15-12-2015   
ТехноМаг
 360 EGP


Рейтинг канала: 2(19)
Репутация: 93
Сообщения: 2513
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Guest :
Для ОС программа продолжает работать.


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

А насчет Infinite Loop - есть такая весчь, как WatchDog. Третьим потоком вешается и смотрит, что происходит в первых двух.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 14:27 15-12-2015   
Vostok-1
 155 EGP


Репутация: 24
Сообщения: 394

Зарегистрирован: 15.08.2015
ТехноМаг :
А насчет Infinite Loop


Типичная игровая логика в целом итеративна, как html страница. Если случается Infinite Loop в логике - индуса, написавшего это нужно отправлять обратно в Индию.
_________________
"The gods do not protect fools.
Fools are protected by more capable fools."

Larry Niven
    Добавлено: 18:28 15-12-2015   
ТехноМаг
 360 EGP


Рейтинг канала: 2(19)
Репутация: 93
Сообщения: 2513
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Vostok-1 :
индуса, написавшего это нужно отправлять обратно в Индию.


Ну... закон Мерфи никто не отменял. И все зависит от кол-ва, качества и интерпритации логики. Иногда от Infinite Loop очень и очень сложно отделаться. Особенно, если что-то из логики приходит по сети.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 18:45 15-12-2015   
Vostok-1
 155 EGP


Репутация: 24
Сообщения: 394

Зарегистрирован: 15.08.2015
Если "что-то из сети" заворачивает логику, значит в "чём-то из сети" не хватает данных. Маркера последовательности, например Улыбка
_________________
"The gods do not protect fools.
Fools are protected by more capable fools."

Larry Niven
    Добавлено: 18:50 15-12-2015   
Sh.Tac.
 151 EGP


Рейтинг канала: 5(108)
Репутация: 14
Сообщения: 1426

Зарегистрирован: 27.07.2005
тоже никогда не сталкивался с зацикливанием логики, особенно по сети, там же событийная модель + таймеры = вся логика

а вот звук запросто может заедать, если его дёргать/останавливать из другого треда, ещё видал в винде Sleep(1) вместо Sleep(0) с тем же эффектом
_________________
This is what you get ...
(c) Radiohead
    Добавлено: 02:38 16-12-2015   
Jurec
 348 EGP


Ведущий раздела
Рейтинг канала: 4(76)
Репутация: 102
Сообщения: 1441 Заблокирован
Откуда: Seattle
Зарегистрирован: 25.02.2006
Все сейчас используют task based подход (intel tbb, apple gcd) - не надо трахаться с всякими мьютексами, семафорами и прочим - у тебя просто есть список задач которые надо сделать и система сама делает их в оптимальном порядке и с оптимальной нагрузкой на все ядра.
_________________
MOV topka, C++
    Добавлено: 15:37 16-12-2015   
Minx
 987 EGP


Модератор
Рейтинг канала: 6(329)
Репутация: 135
Сообщения: 10533
Откуда: Gomel, Belarus
Зарегистрирован: 19.11.2005
ТехноМаг :
А потому что рендер надо вторым потоком ставить.

А как обстоят дела с несколькими параллельными потоками рендеринга?

Vostok-1 :
Типичная игровая логика в целом итеративна, как html страница. Если случается Infinite Loop в логике - индуса, написавшего это нужно отправлять обратно в Индию.

AI типа шахматного в глубину и/или ширину вполне может уйти в Loop, который близок к Infinite. Вполне естественно в таких обсточтельствах ставить таймаут и выдавать лучшее надуманное решение. Однако такой подход в играх - (по моим наблюдениям) - редкость.

Хотя watchdog это крайние обстоятельства. Т.к. грохать неизветсно где в каком состоянии нить, потом за ней чистить и не иметь надежды на корректность и достатка ресурсов, - череповато.
_________________
μηδείς αγεωμέτρητος εισίτω
    Добавлено: 00:11 17-12-2015   
Sh.Tac.
 151 EGP


Рейтинг канала: 5(108)
Репутация: 14
Сообщения: 1426

Зарегистрирован: 27.07.2005
Minx :
А как обстоят дела с несколькими параллельными потоками рендеринга?
смахивает на "переголову", грубо говоря задача подготовить треугольники и отправить на видяху, два потока будут лишь "толкаться"

Цитата:
грохать неизветсно где в каком состоянии нить, потом за ней чистить и не иметь надежды на корректность и достатка ресурсов
известно, тред завис, надо его грохнуть
с корректностью просто, используется транзакционный подход, подаётся срез данных, который нужно изменить, задача подготавливает изменения, если все хорошо, то можно все изменения взять и накатить (commit), если нет, то они тупо сбрасываются (rollback автоматом)
_________________
This is what you get ...
(c) Radiohead
    Добавлено: 02:44 17-12-2015   
Jurec
 348 EGP


Ведущий раздела
Рейтинг канала: 4(76)
Репутация: 102
Сообщения: 1441 Заблокирован
Откуда: Seattle
Зарегистрирован: 25.02.2006
Sh.Tac. :
смахивает на "переголову", грубо говоря задача подготовить треугольники и отправить на видяху, два потока будут лишь "толкаться"

Да ну, все последние API поддерживают многопоточность. Если вы рассматриваете многопоточность как два потока с WatchDog (омг, откуда вы это взяли - это ж эмбедед какой-то) - то тогда да, это не поможет.
Повторюсь - вы сейчас тут обсуждаете какие-то перфокарты. Никто там не пишет уже - все в task-based или async multithreading'е
Грубо говоря можно пустить многопоточную обработку графа сцены и каждый агент который проходит по графу отправляет данные на отрисовку.
Sh.Tac. :
известно, тред завис, надо его грохнуть
с корректностью просто, используется транзакционный подход, подаётся срез данных, который нужно изменить, задача подготавливает изменения, если все хорошо, то можно все изменения взять и накатить (commit), если нет, то они тупо сбрасываются (rollback автоматом)

если тред завис - это баг. его надо фиксить.
что такое "задача подготавливает изменения"? как это "надо его грохнуть"? что это? Подозрение.
_________________
MOV topka, C++
    Добавлено: 02:54 17-12-2015   
Sh.Tac.
 151 EGP


Рейтинг канала: 5(108)
Репутация: 14
Сообщения: 1426

Зарегистрирован: 27.07.2005
Jurec :
Повторюсь - вы сейчас тут обсуждаете какие-то перфокарты
эт точно Улыбка

Цитата:
если тред завис - это баг. его надо фиксить.
это примерно как пропускаемый под дебагом assert/fatal в винде, понятно что баг, но конечный юзер не должен страдать

Цитата:
что такое "задача подготавливает изменения"
это по-другому называется иммутабельность, т.е. исходные данные не меняются в процессе работы, я такое про скриптовую логику хотел, чтобы любой эксепшн не был смертелен, мало ли чего там в скриптах понакосячено, и чтобы не ломалось ничего

например в том же UE кривым блюпринтом можно убить всю игру, а это не всегда желаемый результат Улыбка

добавлено спустя 41 минуту:
Jurec :
можно пустить многопоточную обработку графа сцены и каждый агент который проходит по графу отправляет данные на отрисовку
а вот тупой вопрос у меня, в логике часто возникает ситуация когда порядок неопределён, и если все изменения скажем аддитивны, то проблем не возникает, от перемены мест слагаемых сумма не меняется

а как у рендерщиков с этим?
_________________
This is what you get ...
(c) Radiohead

Последний раз редактировалось: Sh.Tac. (04:03 17-12-2015), всего редактировалось 1 раз
    Добавлено: 04:03 17-12-2015   
Канал Игры Мечты: «Multithreading в играх»
На страницу: 1, 2, 3  След. | Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Обиделся - ко мне, я его научу ЕГу любить!! (Vitalii)

  » Multithreading в играх | страница 1
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18