Каков наилучший способ обработки событий с помощью SDL / C ++? - PullRequest
8 голосов
/ 14 ноября 2010

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

Ответы [ 2 ]

7 голосов
/ 14 ноября 2010

Не беспокойтесь о другой теме. Какой смысл?

Чем занимается ваш основной поток? Я представляю что-то вроде этого:

  1. Обновление логики
  2. Рендер
  3. Перейти к 1

Если вы получили входные данные после (или во время) цикла обновления, вам придется подождать до следующего цикла обновления, прежде чем вы увидите эффекты. То же самое верно во время рендеринга. С тем же успехом вы можете просто проверить ввод перед циклом обновления и сделать все это однопоточным.

  1. Input
  2. Обновление логики
  3. Рендер
  4. Перейти к 1

Многопоточность здесь ничего не дает и только увеличивает сложность.

Для некоторого дополнительного прочтения, прочитайте сообщение в блоге Кристера Эриксона о задержке ввода (он является директором по технологии команды, которая делает God of War).

5 голосов
/ 14 ноября 2010

И я хочу обрабатывать события нажатия клавиш без прерывания основного потока.

SDL по своей природе не является платформой, управляемой прерываниями или событиями.IO происходит путем чтения событий из очереди событий путем вызова SDL_WaitEvent или SDL_PollEvent.Это должно происходить в потоке " main ", который вызвал SDL_SetVideoMode.

Это не означает, что вы не можете использовать несколько потоков, и для этого есть веские основания, например, он может упростить сетевое взаимодействие, если ему не нужно полагаться на цикл событий SDL.Если вы хотите, чтобы моделирование происходило в отдельном потоке, тогда оно может передавать информацию назад и вперед через синхронизированные общие объекты.В частности, вы всегда можете безопасно помещать события в очередь событий SDL из любого потока.

...