|
|
|
Канал Игры Мечты: «Multithreading в играх» |
|
|
Guest 2075 EGP
Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004 |
|
Полуабстрактная тема на поговорить о многопоточности в играх.
Просто интересно: какие части игрового движка в общем случае вы можете предложить запараллелить?
Hard mode: с учётом того, что синхронизация всего состояния нужна каждый кадр.
_________________ Трещит земля как пустой орех
Как щепка трещит броня |
|
|
Vostok-1 155 EGP
Репутация: 24 Сообщения: 394
Зарегистрирован: 15.08.2015 |
|
У меня обычно в отдельном потоке сидит отрисовка, в другом - логика. Но я мобильщик, у пс/приставок наверняка своё видение будет.
_________________ "The gods do not protect fools.
Fools are protected by more capable fools."
Larry Niven |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2513 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Vostok-1 : |
в отдельном потоке сидит отрисовка, в другом - логика.
|
Очень хороший подход, который Конами активно использовали в конце 90ых начале тысячных. При правильном использование лагов не будет даже, если железо не тянет графику.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
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 раз(а) |
|
|
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 раз |
|
|
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 |
|
|
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 раз |
|
|
Guest 2075 EGP
Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004 |
|
Minx : |
Игрок играет по сети
|
и
Minx : |
но ещё ей понижаем приоритет
|
в реал-таймовой игре не приведёт к рассинхрону состояния для сервера и других игроков?
_________________ Трещит земля как пустой орех
Как щепка трещит броня |
|
|
Minx 987 EGP
Рейтинг канала: 6(329) Репутация: 135 Сообщения: 10533 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
Guest : |
в реал-таймовой игре не приведёт к рассинхрону состояния для сервера и других игроков?
|
Рисование фона и синхронизация с сервером это же разные задачи.
В системах с приоритетами одна из самых проблем это расставление приоритетов (; Если архиважна синхронизация с сервером, то её как раз таки можно оформить отдельной нитью с более высоким приоритетом.
Мы так для систем критичных к безопасности делали. Когда для работы по сети писался отдельный модуль, который проектировался так что не мог зациклится в принципе (это даже доказывалось на уровне формальных методов, но для игр это совсем не обязательно я думаю), завершался за очень малое время (менее 1% загрузки CPU), и далее на него вешали высокий приоритет. В результате практически идеальные показатели времени реакции на связь, а основные задачи жили своей жизнью.
_________________ μηδείς αγεωμέτρητος εισίτω |
|
|
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 раз |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2513 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Guest : |
Для ОС программа продолжает работать.
|
А потому что рендер надо вторым потоком ставить. А логический в main. Если зависнит, то тогда можно будет кильнуть.
А насчет Infinite Loop - есть такая весчь, как WatchDog. Третьим потоком вешается и смотрит, что происходит в первых двух.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
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 |
|
|
ТехноМаг 360 EGP
Рейтинг канала: 2(19) Репутация: 93 Сообщения: 2513 Откуда: Кронштадт Зарегистрирован: 09.04.2007 |
|
Vostok-1 : |
индуса, написавшего это нужно отправлять обратно в Индию.
|
Ну... закон Мерфи никто не отменял. И все зависит от кол-ва, качества и интерпритации логики. Иногда от Infinite Loop очень и очень сложно отделаться. Особенно, если что-то из логики приходит по сети.
_________________ (Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей." |
|
|
Vostok-1 155 EGP
Репутация: 24 Сообщения: 394
Зарегистрирован: 15.08.2015 |
|
Если "что-то из сети" заворачивает логику, значит в "чём-то из сети" не хватает данных. Маркера последовательности, например
_________________ "The gods do not protect fools.
Fools are protected by more capable fools."
Larry Niven |
|
|
Sh.Tac. 151 EGP
Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005 |
|
тоже никогда не сталкивался с зацикливанием логики, особенно по сети, там же событийная модель + таймеры = вся логика
а вот звук запросто может заедать, если его дёргать/останавливать из другого треда, ещё видал в винде Sleep(1) вместо Sleep(0) с тем же эффектом
_________________ This is what you get ...
(c) Radiohead |
|
|
Jurec 348 EGP
Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006 |
|
Все сейчас используют task based подход (intel tbb, apple gcd) - не надо трахаться с всякими мьютексами, семафорами и прочим - у тебя просто есть список задач которые надо сделать и система сама делает их в оптимальном порядке и с оптимальной нагрузкой на все ядра.
_________________ MOV topka, C++ |
|
|
Minx 987 EGP
Рейтинг канала: 6(329) Репутация: 135 Сообщения: 10533 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
ТехноМаг : |
А потому что рендер надо вторым потоком ставить.
|
А как обстоят дела с несколькими параллельными потоками рендеринга?
Vostok-1 : |
Типичная игровая логика в целом итеративна, как html страница. Если случается Infinite Loop в логике - индуса, написавшего это нужно отправлять обратно в Индию.
|
AI типа шахматного в глубину и/или ширину вполне может уйти в Loop, который близок к Infinite. Вполне естественно в таких обсточтельствах ставить таймаут и выдавать лучшее надуманное решение. Однако такой подход в играх - (по моим наблюдениям) - редкость.
Хотя watchdog это крайние обстоятельства. Т.к. грохать неизветсно где в каком состоянии нить, потом за ней чистить и не иметь надежды на корректность и достатка ресурсов, - череповато.
_________________ μηδείς αγεωμέτρητος εισίτω |
|
|
Sh.Tac. 151 EGP
Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005 |
|
Minx : |
А как обстоят дела с несколькими параллельными потоками рендеринга?
|
смахивает на "переголову", грубо говоря задача подготовить треугольники и отправить на видяху, два потока будут лишь "толкаться"
Цитата: |
грохать неизветсно где в каком состоянии нить, потом за ней чистить и не иметь надежды на корректность и достатка ресурсов
|
известно, тред завис, надо его грохнуть
с корректностью просто, используется транзакционный подход, подаётся срез данных, который нужно изменить, задача подготавливает изменения, если все хорошо, то можно все изменения взять и накатить (commit), если нет, то они тупо сбрасываются (rollback автоматом)
_________________ This is what you get ...
(c) Radiohead |
|
|
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++ |
|
|
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 раз |
|
|
|
|
|
Канал Игры Мечты: «Multithreading в играх» |
|