2015-05-23 8 views
1

Я заметил, что при работе с каркасом Monogame потоки не приостанавливаются, когда игра перестает рисовать. Например, перемещение окна вокруг. Это небольшая проблема с продолжением игры, пока игрок не видит; Это еще большая проблема при использовании задач.Как приостановить все потоки, пока окно приостановлено

Так как я могу приостановить все потоки, когда игровое окно приостановлено или не рисовано?

+0

Кому-то предложит Thread.Suspend. Не используйте его, он может сломать вашу игру в трудном для тестирования способом. Он может приостановить статический ctor System.String или другого важного класса. Тогда все блокируется. – usr

+0

Хорошо, есть ли что-нибудь, в частности, вы бы предложили? –

+0

Нет, я ничего не знаю о Monogame. Просто пытаюсь спасти вас от этой распространенной ошибки. – usr

ответ

0

Кто-то предложит Thread.Suspend. Не используйте его, он может сломать вашу игру в трудном для тестирования способом. Он может приостановить статический ctor System.String или другого важного класса. Тогда все блокируется. Это трудно проверить, так что вы, скорее всего, узнаете в производстве в удивительное время.

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

static readonly AutoResetEvent evt = new ...; 
//... 
while (...) { //some game loop 
evt.WaitOne(); 
DoWork(); 
} 

This has been made into a nice PauseToken class.

Было бы проще дать хороший ответ, есть ли какой-то код и больше контекста в этом вопросе. Но это должно заставить вас приступить к идее о приостановке потоков совместно.

+0

Спасибо, класс маркера паузы, похоже, сработал. Но когда я реализовал его в своей игре, метод дважды вызывался, хотя был только один экземпляр класса, который он вызывал, а также один вызов фактического метода. Я сейчас забуду о многозадачности. Мне нужно только иметь возможность создавать игры danmaku и сложные шаблоны без гигантских стеков операторов if. Если вы знаете хороший способ сделать это, я хотел бы это услышать. В противном случае, спасибо за помощь. –