Многопоточные игровые компоненты XNA - PullRequest
1 голос
/ 21 марта 2012

Я занимаюсь разработкой проекта XNA, в котором есть два DrawableGameComponents A и B со следующими ограничениями:

  • Либо A является видимым, либо B является видимым. Поэтому должен вызываться только один из их методов " Draw ".
  • Обе A и B должны быть включены - всегда. Таким образом, метод " Update " каждого должен вызываться при любых обстоятельствах.

В настоящее время оба A и B выполняются в одном потоке. Тем не менее, методы «обновления» из них очень интенсивно CPU. Поскольку оба GameComponents не должны общаться друг с другом, и обоим GameComponents не нужно обмениваться какими-либо данными, их легко распараллелить.

Я хотел бы знать, как это сделать в XNA. Методы «Обновление» и «Рисование» вызываются платформой XNA Framework, поэтому я не знаю, куда поместить потоки. Есть ли стандартный способ сделать это?

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Обычно это делается через управление состоянием игры, где класс Game1 (класс по умолчанию) используется для вызова Update() и / или Draw() других классов (игровых компонентов)

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

p.s. если вы не против много читать, взгляните на эту статью о многопоточности XNA, которая сопровождается диаграммами, объясняющими, как она работает очень хорошо.

0 голосов
/ 26 июня 2012

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

При использовании DrawableGameComponents они автоматически синхронизируютсяс вашим Game объектом, но, если вы храните ссылку на каждый компонент вместо того, чтобы создавать их без сохраненной ссылки, например:

componentOne = new FirstComponenet(this);
Components.Add(componentOne);
componentTwo = new SecondComponent(this);
Components.Add(componentTwo);
// Immediately disable componetTwo
componentTwo.Enabled = false; // Prevents Update from firing
componentTwo.Visible = false; // Prevents Draw from firing (for Drawable components only)

, тогда вы можете позволить XNA управлять циклами Update / Draw какпо нормальному.componentOne и componentTwo переменные уровня класса, вы можете управлять, когда каждая из них активна.

Опять же, это основано на предположении, что вам не нужно обновлять одно одновременно с другим..

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