Mit der Windows Phone-Leistungsanalyse wird das Spiel schneller ausgeführt. Mögliche Gründe?


7

Ein XNA-Spiel, das ich gemacht habe, lief langsam auf meinem WP7-Gerät. Als ich es jedoch in Windows Phone Performance Analysis startete, um den Engpass zu finden, lief das Spiel reibungslos auf demselben Gerät.

Ich habe das Problem etwas später herausgefunden und es war eine Funktion zur Überprüfung der Nachbarschaft. Ich habe die Funktion optimiert und das Spiel funktioniert jetzt einwandfrei.

Warum wurde das Spiel im Perf Analysis-Modus auf magische Weise beschleunigt? Irgendwelche möglichen Erklärungen?

Dies war der Code, der im Perf Analysis-Modus schneller lief, ansonsten aber langsam. Es ist eine Schadens verursachende Funktion in einem Tower Defense-Spiel.

 foreach (Target myTarget in _targets)
 {
        for (int x = -1; x <= 1; x++)
        {
                for (int y = -1; y <= 1; y++)
                {
                    if (x == 0 && y == 0) continue;
                    try
                    {
                        Tile adjacent = _tiles[(int)myTarget.CurrentTile.X + x, (int)myTarget.CurrentTile.Y + y];
                        if (adjacent.Tower != null)
                        {
                            DealDamage(myTarget, adjacent.Tower);
                        }
                    }
                    catch
                    {
                    }
                }
            }
 }

Ich habe es später optimiert, indem ich den Schaden für jeden Turm anstelle jedes Ziels überprüft habe.


Ich habe nicht das Wissen, um zu helfen, aber vielleicht würde das Hinzufügen des Codes vor und nach Ihrem Fix anderen helfen.
George Duckett

Um ganz klar zu sein, derselbe Code lief durchweg schneller, während ich ihn im Perf Analysis-Modus ausführte. Ich verstehe die Gründe dafür nicht. Die Tatsache, dass ich den Code später optimiert habe, ist irrelevant.
ApoorvaJ

1
Es ist möglicherweise nicht irrelevant, es klingt so, als ob der von Ihnen geänderte Code im Analysemodus schnell und nicht normal war. Vielleicht könnten Sie es isolieren. Wenn Sie also vorher und nachher gepostet haben, können die Unterschiede darin bestehen, was der Leistungsanalysemodus besser macht (aus welchem ​​Grund auch immer).
George Duckett

@ GeorgeDuckett: Gültiger Punkt. Ich füge den Code hinzu.
ApoorvaJ

2
Vielleicht ist ein Caching-Problem. Möglicherweise liest die Leistung dieselben Variablen wie dieser Code, löst jedoch einen Caching-Mechanismus aus, sodass sich die Daten der Karte immer im Speicher befinden.
Tei

Antworten:


1

Ich vermute, dass der Try / Catch-Overhead für jede Iteration einer potenziell großen verschachtelten Schleife Ihre Leistung beeinträchtigt hat und dass das Analysetool den Overhead des Ausnahmebehandlungsprogramms irgendwie beeinflusst hat. Sie können dies leicht testen, indem Sie die Ausnahmebehandlung entfernen und ohne den Profiler normal ausführen.

Sie wollen definitiv keinen Versuch / Fang an der Innenseite einer engen Schleife. Sie sollten viel besser sicherstellen, dass Sie alles berücksichtigen, was eine Ausnahme innerhalb Ihrer Schleife durch bedingte Überprüfungen erzeugen kann, oder zumindest den Versuch / Fang um die Schleife als Ganzes legen.


Ich werde es versuchen, obwohl ich vermute, dass dieses Verhalten etwas mit Caching zu tun hat.
ApoorvaJ

0

Ich bin weder mit dem Tool selbst vertraut noch ein Experte für Compileroptimierung, aber der Grund könnte in der Zeile liegen:

Tile adjacent = _tiles[(int)myTarget.CurrentTile.X + x, (int)myTarget.CurrentTile.Y + y];

Was hier passieren könnte, ist, dass ein TileNachbar auf dem Stapel erstellt wird, wobei Werte von der rechten Kachel in kopiert werden _tiles[](Sie verwenden keine Referenz in C ++, und ich weiß nicht, ob sie in C # vorhanden sind). Daher erstellen und zerstören Sie kontinuierlich ein TileObjekt und darüber hinaus innerhalb von 2 großen verschachtelten for-Schleifen. Obwohl es auf dem Stapel ist, könnte dies definitiv die Geschwindigkeit beeinflussen. Was möglicherweise passiert ist, ist, dass der Perf Analysis-Modus dieses Szenario erkannt, ein TileObjekt außerhalb der verschachtelten Schleife vorab zugewiesen und über die Funktion weiter verwendet hat, um den Aufwand für die Erstellung / Zerstörung zu vermeiden.


Ich habe dieses Problem früh erkannt und behoben. Es hat mir weder einen spürbaren Leistungsschub gebracht noch die magische Beschleunigung im Perf-Analysemodus verändert.
ApoorvaJ
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.