Friday, December 2, 2011

ElementAt() vs. []

Beispiel: enumeration.ElementAt(i);



In ein paar Arbeiten fiel mir auf, dass ein paar Mitarbeiter die LINQ-Methode ElementAt einsetzten.
Klar war man wollte dort ein Element aus einer Enumeration herausholen. Aber warum nicht mit den eckigen Klammern "[]".

Somit suchte ich mir die Lösung zusammen:
ElementAt kann benutzt werden falls die Enumeration keinen Indexer enthält, somit könnte die Enumeration nicht über den Indexer (eckige Klammer) abgefragt werden. Ausserdem soll die Methode auch nützlich sein falls man nicht weis wie viele Objekte in der Enumeration vorhanden sind.
Was aber ein wichtiger bestandteil diese Methode ist, ist das kontrollieren des Objekttypes. Bei ElementAt wird somit das Element an der gegebenen Position mit dem detektiertem, order vorgegebenen Typ herausgeholt.

Ich kontrollierte darauf ob diese Enumeration einen Index besitzt: Ganz einfach, ich testete es und schaute ob ein Fehler dabei raus kommt was aber nicht der Fall war.
Somit kontrollierte ich mit dem Performance Profiler von RedGate, "ANTS Performance Profiler 6.3", ob ich an dieser Stelle einen Zeitverlust zu verzeichnen habe. Der Test bestätigte meine Vermutung: Zeitverlust.
Diesen kann man somit mit den eckigen Klammern beheben falls die Enumeration einen Index enthält.


Um das ganze zeitlich zu testen, schrieb ich eine kleine Test-Applikation:





Code:


        private void BracketTest()
        {
            int tempVariable;

            //Speed test loop
            for (int i = 0; i < m_Array.Count; i++)
            {
                tempVariable = m_Array[i];
            }
        }

        private void ElementAtTest()
        {
            int tempVariable;

            //Speed test loop
            for (int i = 0; i < m_Array.Count; i++)
            {
                tempVariable = m_Array.ElementAt<int>(i);
            }
        }

Wer den Test selbst durchführen möchte kann dies gerne machen:
SpeedTest.exe*

Hier noch den ganzen Source Code:
SpeedTest.zip*


* Die Links führen auf meinen Öffentlichen Dropbox-Ordner. Die Software ist oder enthält kein Virus oder andere Schadensprogramme.

XNA


XNA - Logo


XNA was ausgeschrieben "XNA ist keine Abkürzung" (engl. "XNA's Not Acronymed") bedeutet ist eine von Microsoft entwickelte Technologie um für Microsoft Windows, Xbox 360, Zune wie auch Window Phone 7 Spiele basierend auf C# zu entwickeln.

XNA verbindet zudem verschiedene Schnittstellen wie Direct3D aus DirectX (2D und 3D Darstellung) wie auch XACT (Audio) und XInput (Peripherie) in einem einzigen Framework.



Kompatibel ist das Framework ab Visual Studio 2005 wobei aber nur die Version 2.0 dafür geeignet ist. Wer aber auch die möglichkeit haben möchte Windows Phone 7 - Spiele zu machen sollte sich mindestens die Express Version von Visual Studio 2010 herunterladen (gratis) und das XNA Framework 4.0. XNA kann als eine grundlegende Game-Engine betrachtet werden jedoch ist wirklich nur eine Basis vorhanden. Wobei zum Beispiel das laden und darstellen von Texturen, Sprites, 3D-Modellen usw. schon implementiert ist und nur noch mit einer Methode aus einer Klasse aufgerufen werden kann.

XNA - 3D Windows Phone 7 Game (Quelle: www.engadget.com)

In Visual Studio ist nach der installation von XNA ein neurer Projekttyp für Windows, Xbox, oder Windows Phone 7 Spiele verfügbar. In einem neuen Projekt sind in der Game-Klasse Methoden wie: LoadContent, UnloadContent, Update und Draw bereits vorhanden.


InitializeDort sollten die Instanzen erstellt werden.
LoadContentDient zum Laden der Texturen, Sprites, Models, Sounds, Musik usw.
UnloadContent   Dient zum freigeben von Speicher nach dem Laden.
UpdateWird mehreremale pro Sekunde aufgerufen und dient zum ausführen der Spiellogik.
DrawIst die Methode in der die Objekte auf den Bildschirm gezeichnet werden. Diese wird auch mehreremale pro Sekunde aufgerufen.

Trotz häufigen Aufrufen dier beiden letzten Methoden läut das Spiel sehr schnell und flüssig. Natürlich ist dies später auch von der Programmierung des Spiels abhängig. Nach Bewertungen und Erfahrungen von anderen Personen soll C# mit XNA bei effizientem Code ziemlich gut mit C++ mithalten können. Falls Interesse besteht: Microsoft bietet auf ihrer Seite ein Tutorial für das Entwickeln von 2D-Games an, jedoch ist dieses nicht in Deutsch verfügbar. Das Tutorial und die Ressourcen findet ihr unter folgendem Link (Englisch):
http://create.msdn.com/en-US/education/tutorial/2dgame/getting_started




Meine Erfahrungen
XNA ist ein sehr praktisches Framework um Spiele zu entwickeln. Momentan studiere ich das Entwickeln von 3D Spielen mit XNA wobei einer der grössten Aufwände das Modellieren der Objekte beansprucht. 2D Spiele waren natürlich leichter zu entwickeln, aber ich arbeite gerne mit XNA da einem vieles vereinfacht wird und vieles schon vorhanden ist. Jedenfalls würde ich XNA jedem weiter empfehlen der gerne Spiele programmieren will und grundlegend mit der Programmiersprache C# vertraut ist.