2012-04-03 3 views
3

Я заметил, что если в приложении WP7 я нажимаю клавишу «Пуск», то быстро возвращаю кнопку «Назад», чтобы вернуться в приложение, и очень быстро повторять эти шаги много раз, приложение заканчивается сбоем (он неожиданно выходит и не может восстановить его с помощью клавиши «Назад»). Это происходит на устройстве (никогда не отображается на эмуляторе), и до закрытия приложения требуется 10-15 шагов. Я следую рекомендациям Microsoft относительно сохранения/восстановления состояния. Кроме того, все другие приложения, которые я пробовал таким образом, тоже сбой. Однако некоторым приложениям гораздо труднее убить, чем другим. В ходе экспериментов с этим стресс-теста, я заметил, что Приложение WP7 выходит из строя при частом включении/деактивизации

  • XNA игры, как правило, менее устойчивы, чем чистые Silverlight приложений
  • Чем больше данных приложение сохраняет/восстанавливает, тем менее устойчива она является
К сожалению, моя XNA игра должна сохранить много данных во время деактивации, и довольно легко получить его разбился.

Кто-нибудь знает, если это известная проблема или что-то еще? Буду признателен за то, как сделать игру более стабильной, если невозможно полностью устранить проблему.

+0

Предоставляются ли вам данные о сбоях, такие как трассировка стека или исключение? –

+1

Если вы не можете воспроизвести проблему с прикрепленным отладчиком, найдите обработчик исключенных обработчиков в app.xaml.cs, напишите деталь исключения в изолированное хранилище, а затем при следующем запуске отобразите его. –

+0

Я видел это раньше. Он сбой во время десериализации (если сериализация еще не завершена), и никакой код пользователя не выполняется, чтобы предотвратить его с помощью try/catch или что-то еще.Будет здорово, если кто-нибудь узнает о решении – Ku6opr

ответ

1

на идее, что проблема может лежать в пределах De/-Serialization процесса вы могли бы сделать это:

private IsolatedStorageSettings isosettings = IsolatedStorageSettings.ApplicationSettings; 
    void Application_deactivated() 
    { 
     isosettings.Add("serialization_finished", false);//just add once, 
        //after that use isosettings["serialization_finished"] 
     //DO: save here your code into isostorage 
     isosettings["serialization_finished"] = true; 
    } 
    void Application_activated() 
    { 
     while (!isosettings["serialization_finished"]) 
      Thread.Sleep(500); 
     //DO: read you data from isostorage 
    } 

Таким образом, вы практически построить включения/выключения, чтобы проверить, если сериализация-процесс завершается

Старый:

Tombstoning имеет TimeLimit, в котором он должен быть завершен (10 секунд). Мое предположение заключается в том, что вы уделяете ему столько внимания на надгробном камне, что в какой-то момент один экземпляр приложения не может завершить надгробный памятник во времени. Но это просто предположение о том, что тем больше, чтобы сэкономить = быстрее, чтобы сбой.

Вы можете проверить это, измерив время, необходимое для надгробной плиты , и записать данные в изолированное хранилище. Когда вы анализируете данные и видите, что время для гробницы увеличивается (до 8-9 секунд), вы можете заключить, что это должно быть время.

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

+0

Благодарим вас за ответ. Я измерил время дезактивации и заметил, что он всегда остается около 1 секунды, поэтому вряд ли проблема накопления. Но как-то уменьшение этого времени (например, не сохранение части игровых данных) делает игру более стабильной. Не слишком много, но в любом случае. – mbakulin

1

Я нашел обходной путь, как сделать приложение немного более стабильной , На самом деле, мы не хотим сохранять данные игры в изолированном хранилище каждый раз во время деактивации. Это необходимо, только когда состояние игры было изменено. Поскольку моя игра автоматически приостанавливается после активации, это состояние не изменилось, и мне не нужно сохранять свои данные снова, пока пользователь не возобновит игру. Таким образом, хранение данных в изолированном хранилище происходит только для первой деактивации. Этот подход помог немного, но не слишком. 20 итераций клавиши «Пуск»/«Назад» по-прежнему заставляют ее спускаться вниз.

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