Es kling unglaublich ist aber wahr! Ich habe die Performance von tKoD mit 10 Zeilen Code Änderung um 500% verbessert!
Ich hatte festgestellt, das ich im Menü 2800 FPS (normal für Menüs) hatte, im Spiel aber nur 75 FPS. Das ist zwar immer noch gut, aber für ein 2D Spiel auf einem guten Rechner nicht berauschend…
Also musste ein Profiler ran(Der von EQAUTEC, kann ich nur empfehlen). Das profilen ergab, dass die auffälligste Methode war die Kameraberechnung. Die sah so aus:
public static Vector2 CameraPosition
{
get
{
return new Vector2(
Math.Min(
TilemapHelper.ActiveTilemap.Width * 32 - GOA.Game.GraphicsDevice.Viewport.Width,
Math.Max(0, GOA.Hero.ExactPosition.X - GOA.Game.GraphicsDevice.Viewport.Width / 2)),
Math.Min(
TilemapHelper.ActiveTilemap.Height * 32 - GOA.Game.GraphicsDevice.Viewport.Height,
Math.Max(0, GOA.Hero.ExactPosition.Y - GOA.Game.GraphicsDevice.Viewport.Height / 2)));
}
}
Wo lag der Fehler? Ganz einfach, Camera Position wird bei jedem Tile und NPC abgefragt. Da .NET scheinbar das ganze nicht cached, wird die Position jedes Mal neu berechnet. Und das über 5.000 Mal pro Frame! Was also tun? Einfach den Wert selber cachen! Nur einmal pro Frame berechnen, und dann nur noch zurückgeben. Und schon hat man 500% mehr Performance!
Also: Benutzt einen Profiler, es lohnt sich!