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

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

Search | Conference rules | Album | Register | Pilots list | Profile | Log in to check your private messages | Log in

   Page 1 of 3
Go to page: 1, 2, 3  Next | All pages
Поиск в этой теме:
Канал Игры Мечты: «Multithreading в играх»
Guest
 2076 EGP


Модератор
Рейтинг канала: 5(167)
: 376
Posts: 27975
Location: Моск.
Joined: 12 Oct 2004
Полуабстрактная тема на поговорить о многопоточности в играх.

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


: 24
Posts: 394

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

Larry Niven
    Posted: 08:00 14-12-2015   
ТехноМаг
 360 EGP


Рейтинг канала: 2(19)
: 93
Posts: 2521
Location: Кронштадт
Joined: 09 Apr 2007
Vostok-1 wrote:
в отдельном потоке сидит отрисовка, в другом - логика.


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


Модератор
Рейтинг канала: 6(332)
: 139
Posts: 10551
Location: Gomel, Belarus
Joined: 19 Nov 2005
Guest wrote:
Minx wrote:
То ли квалификации не хватает (события и нити не проходили?), то ли собрать однопоточно по-быстрому проще, то ли ещё что.

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

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

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

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

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

Last edited by Minx on 14:50 14-12-2015; edited 2 times in total
    Posted: 13:55 14-12-2015   
Guest
 2076 EGP


Модератор
Рейтинг канала: 5(167)
: 376
Posts: 27975
Location: Моск.
Joined: 12 Oct 2004
ТехноМаг wrote:
Vostok-1 wrote:
в отдельном потоке сидит отрисовка, в другом - логика.


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

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

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

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

Last edited by Guest on 16:47 14-12-2015; edited 1 time in total
    Posted: 16:47 14-12-2015   
Vostok-1
 155 EGP


: 24
Posts: 394

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


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

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


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

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

Larry Niven
    Posted: 17:12 14-12-2015   
Minx
 1025 EGP


Модератор
Рейтинг канала: 6(332)
: 139
Posts: 10551
Location: Gomel, Belarus
Joined: 19 Nov 2005
Guest wrote:
А что касается постоянно крутимых задач?

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

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

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

Last edited by Minx on 19:13 14-12-2015; edited 1 time in total
    Posted: 19:11 14-12-2015   
Guest
 2076 EGP


Модератор
Рейтинг канала: 5(167)
: 376
Posts: 27975
Location: Моск.
Joined: 12 Oct 2004
Minx wrote:
Игрок играет по сети

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

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


Модератор
Рейтинг канала: 6(332)
: 139
Posts: 10551
Location: Gomel, Belarus
Joined: 19 Nov 2005
Guest wrote:
в реал-таймовой игре не приведёт к рассинхрону состояния для сервера и других игроков?

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

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

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


Рейтинг канала: 5(108)
: 14
Posts: 1426

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

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

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

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

Last edited by Sh.Tac. on 04:21 15-12-2015; edited 1 time in total
    Posted: 04:21 15-12-2015   
ТехноМаг
 360 EGP


Рейтинг канала: 2(19)
: 93
Posts: 2521
Location: Кронштадт
Joined: 09 Apr 2007
Guest wrote:
Для ОС программа продолжает работать.


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

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


: 24
Posts: 394

Joined: 15 Aug 2015
ТехноМаг wrote:
А насчет Infinite Loop


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

Larry Niven
    Posted: 18:28 15-12-2015   
ТехноМаг
 360 EGP


Рейтинг канала: 2(19)
: 93
Posts: 2521
Location: Кронштадт
Joined: 09 Apr 2007
Vostok-1 wrote:
индуса, написавшего это нужно отправлять обратно в Индию.


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


: 24
Posts: 394

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

Larry Niven
    Posted: 18:50 15-12-2015   
Sh.Tac.
 151 EGP


Рейтинг канала: 5(108)
: 14
Posts: 1426

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

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


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


Модератор
Рейтинг канала: 6(332)
: 139
Posts: 10551
Location: Gomel, Belarus
Joined: 19 Nov 2005
ТехноМаг wrote:
А потому что рендер надо вторым потоком ставить.

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

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

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

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


Рейтинг канала: 5(108)
: 14
Posts: 1426

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

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


Ведущий раздела
Рейтинг канала: 4(76)
: 102
Posts: 1441 Заблокирован
Location: Seattle
Joined: 25 Feb 2006
Sh.Tac. wrote:
смахивает на "переголову", грубо говоря задача подготовить треугольники и отправить на видяху, два потока будут лишь "толкаться"

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

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


Рейтинг канала: 5(108)
: 14
Posts: 1426

Joined: 27 Jul 2005
Jurec wrote:
Повторюсь - вы сейчас тут обсуждаете какие-то перфокарты
эт точно Улыбка

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

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

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

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

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

Last edited by Sh.Tac. on 04:03 17-12-2015; edited 1 time in total
    Posted: 04:03 17-12-2015   
Канал Игры Мечты: «Multithreading в играх»
Go to page: 1, 2, 3  Next | All pages
  
Display posts from previous: 
View previous topic | View next topic |
К списку каналов | Наверх страницы
Цитата не в тему: Мы же никого не заставляем рыбок мочить... Хотя чешуя красиво разлетается... (Garmahis)

  » Multithreading в играх |
Каналы: Новости | 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