Как правильно использовать SDl_Threads? - PullRequest
1 голос
/ 13 апреля 2009

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

Поскольку один из моих проектов - стрелялка, мне было интересно, должен ли я создать один поток, отображающий всю графику, один поток получает все данные игрока для своего корабля, а другой - для вражеского ИИ.

Если это НЕ так, как это должно быть сделано (я думаю, что это неправильно), есть ли у кого-нибудь совет, как следует реализовывать графику с помощью пользовательского ввода и искусственного интеллекта противника с потоками?

Для учебников Lazyfoo это ссылка: http://lazyfoo.net/SDL_tutorials/

Ответы [ 2 ]

0 голосов
/ 10 декабря 2011

Когда вы только начинаете, разделять темы на основе обязанностей гораздо проще. Более «правильный» подход к этому, который приводит к большей масштабируемости, состоит в использовании пулов потоков. Существуют готовые решения для пула потоков, в том числе для SDL.

Если вы используете OpenGL или DirectX для рендеринга, я сомневаюсь, что вызовы этих API приведут к большим накладным расходам, так что вы можете по крайней мере выполнить (обязательно) последовательные части игрового цикла в основном потоке: get ввод, обновление модели мира (в том числе с использованием результатов ai calcs), рендеринг. Тогда вы можете иметь AI, сетевые потоки, работающие параллельно. Таким образом, вам не нужно беспокоиться об отдельном потоке рендеринга. Из этого есть одно исключение: если вы выполняете тяжелый в вычислительном отношении (а я имею в виду, как в рэйкастинге / рэйтрейсинге) рендеринг в программном обеспечении, то вам лучше было бы как-то выполнить «логику» рендеринга в параллельном потоке, записывая в кадровый буфер а затем в главном потоке выполняем последовательность, указанную выше, и просто копируем подготовленный фреймбуфер с помощью например. GDI.

Что касается рендеринга, то да, рендеринг AFAIK только из одного потока (основного потока) является (или был), как правило, хорошей идеей для обеспечения, например,. с OpenGL у вас нет проблем. Опять же AFAIK это больше не проблема на основных платформах. Кроме того, я не знаю, есть ли у GDI или DirectX одинаковые проблемы.

0 голосов
/ 13 апреля 2009

Как правило, я считаю хорошей идеей отделить поток рендеринга от потоков UI / AI. Это помогает сделать ваш код более понятным. Поскольку в исходном коде доступно много игр, почему бы вам не проверить, как они это сделали?

...