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!

Fehler in XNA Audio API?

Mit der Audio API von XNA schlage ich mich ja schon länger herrum… Immer wieder erzeugen meine Versuche die Lautstärke zu ändern(auf gültige Werte versteht sich…) seltsamme Fehler. Ich hatte länger mit einer CrossThreadCallMessagingExeption zu kämpfen, bis sie auf einmal nicht mehr auftrat.

Ich hatte das Problem als erledigt abgetan. Heute kommt beim starten plötzlich ein Fehler: Die Zeile

SoundEffect.MasterVolume = 0.15f;

Erzeugt eine AccessViolationExeption!

Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

??? Was soll das denn heissen? Im Internet finden sich Hinweise, dass dieses Problem auftritt wenn man in .NET mit unsafe Code(sprich Zeigern) arbeitet und diese dann in auf Systemspeicher zeigen. Da .NET nicht für unsafe Code gemacht ist, geht es davon aus, dass der RAM einen Fehler hat und deshalb ein (interner) Zeiger kaputt ist.

Weiterlesen

XNA 3.1 verfügbar ?!

Heute auf Ziggyware gelesen, das XNA 3.1 erschienen ist. Hier was Microsoft schreibt:

You spoke and we listened! We’ve added a number of new and improved features to XNA Game Studio 3.1 enabling hobbyists, academics, and independent game developers to easily create video games for Xbox 360, Windows, and Zune digital media players by using optimized cross-platform gaming libraries based on the .NET Framework in the C# programming language. This release is incremental to Game Studio 3.0 and contains many new and improved features:

  • Avatar Support: Render and animate Avatars to use in your game to represent gamers and other characters within your game.
  • Xbox LIVE Party Support: Enabling gamers to communicate, even when each gamer is not playing the same game in the same multiplayer session. LIVE Party supports up to an eight-way group voice chat for gamers and keeps gamers connected before, during, and after a gameplay session, persisting across title switches.
  • Video Playback: XNA Game Studio now supports the ability to play back video that can be used for such purposes as opening splash and logo scenes, cut scenes, or in-game video displays. This set of XNA Framework APIs supports the following features: Weiterlesen

Einfache Texteingabe mit XNA

Mit dem neuen Syntax Highlighter(siehe letzter Post) kann ich das hier ja auch mal veröffendlichen:

Wer sich mit XNA beschäftigt, wird irgendwann feststellen, das es keine Möglickeit gibt den Benutzer seinen Namen o. ä. eingeben zu lassen. Im Internet findet man nur aufgeblähten Code mit Lookup Tabellen.

Von Microsoft gibt es eine Möglichkeit:

Guide.BeginnKeyBoardInput()

Aber die zerstört doch das Layout eines Spiel arg.(Am PC noch mehr als an der XBOX 360) Also war mal wieder Handarbeit gefragt!

Die im folgenden vorgestellte Komponente kann ohne Problem verwendet werden, auch in kommerziellen Produkten. Ich würde im aber in jedem Fall über einen Kommentar freuen!

Weiterlesen