Многопоточность в игре XNA - PullRequest
       11

Многопоточность в игре XNA

2 голосов
/ 21 декабря 2009

Где я могу использовать многопоточность в простой игре 2D XNA? Любые предложения будут оценены

Ответы [ 5 ]

10 голосов
/ 21 декабря 2009

Ну, есть много вариантов -

Большинство игр используют многопоточность для таких вещей, как:

  1. Физика
  2. Сеть
  3. Загрузка ресурсов
  4. AI / Логические обновления (если у вас много вычислений в фазе «обновления» вашей игры)

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

3 голосов
/ 27 декабря 2009

Некоторые игры используют многопоточные рендеры в качестве основной философии дизайна.

Например ... поток 1 вычисляет всю игровую логику, а затем отправляет эту информацию в поток 2. Поток 2 предварительно вычисляет список отображения и передает его в графический процессор. Поток 1 в конечном итоге запускает 2 кадра за графическим процессором, поток 2 выполняет один кадр за графическим процессором.

Преимущество в том, что вы теоретически можете выполнять вдвое больше работы в кадре. Скинирование может выполняться на процессоре и может стать «свободным» с точки зрения времени процессора и графического процессора. Для этого требуется двойная буферизация большого объема данных и тщательное построение потока вашего двигателя, чтобы все потоки останавливались, когда (и только когда) это необходимо.

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

Например, дорогой цикл for можно заменить на используемые задачи.

// Single threaded method.
for (i = 0; i < numExpensiveThings; i++)
{
  ProcessExpensiveThings (expensiveThings[i]);
}

// Accomplishes the same work, using N worker threads.
for (i = 0; i < numExpensiveThings; i++)
{
  AddTask (ProcessExpensiveThingsTask, i);
}
WaitForAll (ProcessExpensiveThingsTask);

Вы можете сделать это, когда вам гарантировано, что ProcessExoyThings () является поточно-ориентированным по отношению к другим вызовам. Если у вас есть 80 вещей на 1 мс каждый и 8 рабочих потоков, вы сэкономили примерно 70 мс. (Ну, не совсем, но это хорошее волнообразное приближение.)

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

Многопоточность с GameComponents должна быть достаточно простой например

http://roecode.wordpress.com/2008/02/01/xna-framework-gameengine-development-part-8-multi-threading-gamecomponents/

0 голосов
/ 21 декабря 2009

Почему вы хотите использовать многопоточность?

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

0 голосов
/ 21 декабря 2009

Есть много мест, куда можно обратиться: AI, взаимодействие с объектами, многопользовательские игры и т. Д. Это зависит от конкретной игры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...