Приложение XNA не отвечает - PullRequest
4 голосов
/ 28 мая 2011

У меня есть приложение XNA 3.1 на Windows 7 x64 с VS 2008. Через ~ 7 секунд окно станет серым, если игра не имеет фокуса (иногда!). Название добавляет Not Responding. Если игра имеет фокус, окно может слегка изменить положение на экране, и значок приложения на моем трее переместится, как будто он открывает новую программу.
Это происходит только в течение доли секунды, а затем значок приложения возвращается в исходное положение. Это делается как в режиме отладки, так и в режиме выпуска. Это странно, потому что, насколько я могу судить, приложение не застряло ни в одном цикле. Если я захожу в VS и приостанавливаю код, пока он не отвечает, он показывает мне Instance.Run в классе Program, как и должно быть. Я попытался приостановить его в тот самый момент;

Стек вызовов выглядит следующим образом: [Во сне, подождите, или присоединиться]
Внешний код. ->
mscorlib.dll! System.Threading.Thread.Sleep (int millisecondsTimeout) + 0x5 байт Microsoft.Xna.Framework.Game.dll! Microsoft.Xna.Framework.Game.Tick () + 0x98 байт
Microsoft.Xna.Framework.Game.dll! Microsoft.Xna.Framework.Game.HostIdle (отправитель объекта ... Microsoft.Xna.Framework.Game.dll! Microsoft.Xna.Framework.GameHost.OnIdle () + 0x3d байт
... и т. д.

Если я нажму «запустить» во время паузы, программа будет работать и разморозится. Приложение не разморозится, как только перейдет в этот режим без ответа. Все звуки продолжают работать, когда он не отвечает.

Кроме того, у меня есть метод, который переопределяет событие OnDeactivated(), и оно вызывается, когда приложение теряет отзывчивость, даже если приложение будет фокусироваться. Я попытался установить последние версии драйверов для моей видеокарты, но это не помогло решить эту проблему. Эта проблема также возникает при запуске исполняемого файла без VS. Как я уже говорил, эта проблема возникает ~ 75% времени ... в противном случае она работает нормально.

Я нашел только одно сообщение на форуме по этой проблеме: http://forums.create.msdn.com/forums/p/56743/346180.aspx

It looks like it was never resolved.

Ответы [ 2 ]

4 голосов
/ 11 июня 2011

Оказывается, я проверял Mediaplayer.State в методе Update (), и из-за моего профилировщика я обнаружил проблему. MediaPlayer.State - это дорогостоящее перечисление для получения, и после удаления этого блока оно больше не зависает.

0 голосов
/ 31 мая 2011

это звучит как довольно странная проблема ... единственное, что приходит на ум, - это то, что, возможно, приложение не справляется с потерей устройства элегантно.Я знаю, что это довольно расплывчато, но, возможно, это может быть намек.Ознакомьтесь со всеми процедурами загрузки контента (особенно если вы создаете какие-либо ресурсы вручную, а не через конвейер контента ... проверьте событие DeviceLost и т. Д.

некоторая дополнительная информация: посмотрите этот пост в блоге от команды XNA о том, как правильно обрабатывать ресурсы и события потери / сброса устройства: http://blogs.msdn.com/b/xna/archive/2006/09/18/761355.aspx

еще больше информации: the сообщение на форуме , где я получил ссылку выше, имеет хорошую цитату из Шона Харгривза, поэтому я думаю, что это может быть связано с тем, что вы испытываете:

Устройство потеряно и устройство воссозданоЭто разные вещи. Автоматические ресурсы пула выживут, если устройство потеряно, но его нужно создавать заново при каждом воссоздании устройства.

Потеря устройства происходит во многих местах: при изменении разрешения, удалении вкладки из полноэкранного приложения, блокировкетерминал и т. д.

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

...