2013-09-17 4 views
0

В настоящее время я перехожу к игре, которую я создал из последовательного подхода XNA (последовательные вызовы Updates and Draws) в многопоточный подход.Отмена основной темы XNA?

Мне уже удалось переместить обновления игр и привлечь другие задачи/потоки. Единственная проблема, с которой я столкнулась, - это выяснить, как прервать основной поток XNA (класс, который расширяет класс Game), потому что у меня буквально есть пустые методы Update() и Draw().

При попытке прервать эту нить через:

System.Threading.Thread.CurrentThread.Abort(); 

в качестве последней линии Initialize() метода в Game класса, все приложение завершается. Итак, есть ли способ прервать основной поток XNA и все еще иметь исполняемое окно игры? Причина, по которой я пытаюсь закончить этот поток, заключается в том, что я не хочу, чтобы он влиял на производительность игры, выполняя пустые обновления/рисования.

+0

Если вы не хотите, чтобы основной поток вызывал 'Update' и' Draw', вы можете по крайней мере установить 'Enable = Visible = false;' – pinckerman

+0

@pinckerman Это работает только для ('Drawable')' GameComponent's ' , Такой основной вариант не существует. –

+0

@AndrewRussell Вы правы, моя вина. – pinckerman

ответ

2

Ну, вы действительно не хотите прервать основную нить. Эта ветка владеет окном, которое XNA использует для отображения, а вы можете делать только входные данные на основной теме (то есть: Mouse.GetState, Keyboard.GetState и т. Д.).

Вызов Abort на нем эквивалентно поднимая ThreadAbortException, которая будет пузыриться и (в шаблоне по умолчанию Program.cs) очистить свой игровой экземпляр (см using заявления).

Просьба просто использовать эту основную нить как резьбу, ответственную за обработку Update или Draw.


Но если вы действительно получил ваше сердце установить на этом, вы можете остановить XNA из насосных обновления с помощью этого кода: (. Требует ссылки и использование System.Windows.Forms)

Application.Idle = null; 

Возможно, вы можете использовать Game.RunOneFrame или Tick, если вы хотите продолжить использовать функциональные возможности в Game. Не знаю, как отличные способы, в которых XNA может взорваться, если вы попытаетесь вызвать эти методы вне потока.

Если вы не используете их, вам необходимо предоставить свой собственный временной код, вам необходимо регулярно звонить по телефону FrameworkDispatcher.Update (требуется для аудио).

В любом случае вам придётся выяснить способ ввода ввода в основной поток. Контур сообщения Win32 все равно будет выполняться в этом потоке (или, скорее, блокировке), поэтому вам нужно подключиться к нему, чтобы выполнить ввод.

+0

Спасибо. Еще одна причина для использования основного потока XNA заключается в том, что вы не можете сбросить графическое устройство из другого потока, отличного от основного! Я просто нашел это, когда получил «неопределенное» исключение при попытке его сбросить.Согласно MSDN: вызов Reset завершается с ошибкой, если он сделан в другом потоке, чем тот, который используется для создания сброса GraphicsDevice – user1258126

Смежные вопросы