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.
quelle
Antworten:
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.
quelle
Ich bin weder mit dem Tool selbst vertraut noch ein Experte für Compileroptimierung, aber der Grund könnte in der Zeile liegen:
Was hier passieren könnte, ist, dass ein
Tile
Nachbar 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 einTile
Objekt 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, einTile
Objekt 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.quelle