XNA 4.0 in Deutsch & Performance Tools

Gleich zwei super Neuigkeiten heute:

  1. XNA gibt es jetzt auch auf Deutsch! Das betrifft auch die komplette Dokumentation, also auch die IntelliSense Tipps. Eine super Sachen, finde ich, nicht weil ich Probleme mit der englischen Version hatte, sondern, weil es immer gestört hat, wenn im deutschen VisualStudio an und an englische Tooltipps erschienen
  2. Es gibt von Microsoft ein „Performance Utility„. Das ist eine Overlaykomponente, mit der die Update und Draw Zeit angezeigt wird, eine FPS Anzeige, ein Overlay, dass einfach beliebige Werte anzeigt, und eine Ingame-Console.

Besonders freut mich die Console (wenn sie gut ist ;)), denn nachdem meine „alte“ Console, nicht mehr für XNA 4.0 geupdatet wurde, musste ich mir was neues suchen. Für gewöhnlich sind die Sachen von Microsoft ja ziemlich gut (weil sie sie selber brauchen :D), evtl. bleibt mir da noch Arbeit erspart. (Know when to be lazy)

Weiterlesen

100 FPS mehr durch Tilemap Clipping

Da ich momentan noch auf Bug-Jagd durch die Tiefen von The Kingdom of Darkness bin, habe ich heute mal zu Abwechslung das Tilemap Clipping eingebaut. Durch diese Technik werden einfach nicht alle Tiles gezeichnet, sondern nur die, die auch grade auf dem Bildschirm zu sehen sind.

Der Performancegewinn hängt von der Größe der Karte ab, bei mir hat es 100 FPS gebracht. Das ist weniger als es erstmal klingt, den ob ein Spiel nun mit  300 oder 400 Frames pro Sekunde läuft kann man nicht merken… Trotzdem hatte ich schon lange vor diese Technik einzubauen. Die Änerung ist eigentlich auch nur sehr klein:

for (int i = (int)Camera.CameraPosition.X / 32; i < Math.Min(((int)Camera.CameraPosition.X / 32) + 26, Tiles.Count); i++)
 {
 // Alle Spalten durchlaufen
 for (int j = (int)Camera.CameraPosition.Y / 32; j < Math.Min(((int)Camera.CameraPosition.Y / 32) + 20, Tiles[0].Count); j++)
 {

Weiterlesen

tKoD Performance um 500% verbessert!

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!