2012-04-03 16 views
3

Ich bemerkte, dass, wenn in WP7 Anwendung ich Start-Taste drücken Sie dann schnell Zurück-Taste, um zur App zurückzukehren, und sehr schnell diese Schritte wiederholen oft, die Anwendung wird abgestürzt (Es wird unerwartet beendet und es gibt keine Möglichkeit, es über die Zurück-Taste wiederherzustellen). Dies geschieht auf dem Gerät (nie auf Emulator gesehen), und es dauert 10-15 Schritte, bevor die Anwendung heruntergefahren wird. Ich befolge die Microsoft-Richtlinien zum Speichern/Wiederherstellen des Status. Außerdem stürzen alle anderen Apps, die ich auf diese Weise ausprobiert habe, ebenfalls ab. Einige Apps sind jedoch auf diese Weise viel schwieriger zu töten als die anderen. Bei Versuchen mit diesem Stresstest, bemerkte ich, dass WP7 Anwendung stürzt ab, wenn häufig aktiviert/deaktiviert

  • XNA-Spiele sind in der Regel weniger als resistent als reine Silverlight-Anwendungen
  • Je mehr Daten die Anwendung speichert/erholt, desto weniger beständig ist
Leider hat mein XNA-Spiel zu retten eine Menge Daten während der Deaktivierung, und es ist ziemlich einfach, es abgestürzt zu bekommen.

Weiß jemand, ob es ein bekanntes Problem oder etwas anderes ist? Ich würde mich über jeden Hinweis freuen, wie man das Spiel stabiler macht, wenn es nicht möglich ist, das Problem vollständig zu beseitigen.

+0

Haben Sie Absturzdetails wie Stack-Trace oder Ausnahme? –

+1

Wenn Sie das Problem mit dem angehängten Debugger nicht reproduzieren können, suchen Sie den unbehandelten Exception-Handler in app.xaml.cs, schreiben Sie die Ausnahmedetails in den isolierten Speicher, und zeigen Sie sie beim nächsten Start an. –

+0

Ich habe es schon mal gesehen. Es stürzt während der Deserialisierung ab (wenn die Serialisierung noch nicht abgeschlossen ist), und es wird kein Benutzercode ausgeführt, um dies mit try/catch oder etwas anderem zu verhindern.Es wird großartig sein, wenn jemand eine Lösung kennt – Ku6opr

Antwort

1

auf der Idee, dass das Problem innerhalb der De/-Serialization Prozess legen könnten Sie dies tun könnte:

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 
    } 

So bauen Sie praktisch einen Ein-/Aus-Schalter zu testen, ob die Serialisierung-Prozess beendet ist

Alt:

Das hat Tombstoning eine Frist, in der er (10 Sekunden) abgeschlossen werden muß. Meine Vermutung ist hier, dass Sie ihm so viel zum Grabstein geben, dass an einem Punkt eine Instanz der Anwendung die Grabstein in der Zeit nicht beenden kann. Aber das ist nur eine Annahme unter der Prämisse, dass desto mehr zu retten = schneller zum Absturz.

Sie könnten das testen, indem Sie die Zeit messen, die Sie für das Tombstoning benötigen und die Daten in den isolierten Speicher schreiben. Wenn Sie die Daten analysieren und sehen, dass die Zeit für den Grabstein zunimmt (bis zu 8-9 Sekunden) können Sie daraus schließen, dass es die Zeit sein sollte.

Auf der anderen Seite, wenn die Zeit nie und bleibt man mit Sicherheit schließen kann innerhalb einiger Sekunden erhöht erforderlich, dass es ein bisschen um die Anwendung zu machen stabile

+0

Vielen Dank für Ihre Antwort. Ich habe die Deaktivierungszeit gemessen und festgestellt, dass sie immer bei etwa 1 Sekunde bleibt, daher ist das Problem der Akkumulation unwahrscheinlich. Aber eine gewisse Verringerung dieser Zeit (z. B. indem der Teil der Spieldaten nicht gespeichert wird) macht das Spiel stabiler. Nicht zu viel, aber trotzdem. – mbakulin

1

ich eine Abhilfe, wie gefunden ein timeproblem sein shouldnt . Eigentlich möchten wir die Spieldaten nicht jedes Mal während der Deaktivierung im isolierten Speicher speichern. Es wird nur benötigt, wenn der Spielstatus geändert wurde. Da mein Spiel nach der Aktivierung automatisch angehalten wird, hat sich sein Zustand nicht geändert und ich muss seine Daten nicht erneut speichern, bis der Benutzer das Spiel wieder aufnimmt. Daher erfolgt das Speichern von Daten im isolierten Speicher nur für die erste Deaktivierung. Dieser Ansatz half ein wenig, aber nicht zu viel. 20 Wiederholungen der Start-Taste/Zurück-Taste lassen es immer noch sinken.