C ++ / SDL threading - события ломаются - PullRequest
1 голос
/ 07 декабря 2010

У меня в разработке игра Snake (до https://github.com/RobotGymnast/Gingerbread/tree/eventThreaded).) Изначально все (графика, события, обновление логики игры, физика) вызывались из «основного» потока. Затем я начал многопоточность (используя boostЭто было довольно просто, но я недавно разделил логику графического дисплея на новый поток, который выделил экранный объект в его локальном пространстве стека. Затем я разделил свою логику обнаружения и обработки событий на новый поток.мой экран перестал появляться. Судя по выводу командной строки, все по-прежнему работало нормально, просто экран перестал появляться. Оказалось, что он зависает при моем вызове SDL_SetVideoMode ().

Я исправил это, выделив свой экранобъект в "главном" потоке и передача ссылки на графический поток. По какой-то причине выделение экранного объекта в новом потоке из логики событий создавало проблемы.

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

Я подозреваю, что SDL может выполнять некоторую закулисную синхронизацию потоков, ноЯ использую темы повышения.Может ли это быть проблемой?Потоки SDL довольно ограничены, и я бы предпочел не переключаться.

У кого-нибудь была эта проблема раньше?Любые рекомендации?

Ответы [ 2 ]

3 голосов
/ 07 декабря 2010

Логика отображения графики почти всегда должна быть в главном потоке из-за некоторых технических соображений на различных платформах.

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

В большинстве случаев я бы рекомендовал не вызывать никаких функций SDL из чего-либо, кроме основного потока, кроме тех, которые не работают в общем состоянии.1005 *

3 голосов
/ 07 декабря 2010

Я не уверен насчет SDL, но в нескольких оконных подсистемах (я полагаю, и для X, и для Win32) вы не можете изменять НИЧЕГО, связанное с графическим объектом или виджетом, кроме как из потока, который первоначально создал этот графический объект / виджет .

Это не похоже (по моему ограниченному 10-секундному поиску в Google), что SDL абстрагирует вас от этого - вам нужно будет только изменить связанные с графикой объекты из потока, который их создал. Делать иначе - значит приглашать странное поведение.

...