Möchte man Netzwerkspiele oder sonstige netzwerk-fähige Anwendungen schreiben, findet man eine ganze Menge guter Bibliotheken für C++ im Internet. Im .NET Bereich ist die Auswahl jedoch nicht gerade groß, dafür gibt es eine ausgezeichnete C#-Bibliothek namens Lidgren, die fast keine Wünsche offen lässt.

Lidgren setzt auf das Netzwerkprotokoll UDP (User Datagram Protocol), baut jedoch auch Charakterisken einer TCP-Verbindung nach, was die Bibliothek sehr flexibel macht. Man kann als Programmierer selber entscheiden wie wichtig die Daten sind, die man versendet und ob die Reihenfolge beim Empfänger genau stimmen muss.

Die Besonderheit des UDP-Protokolls besteht ja darin, dass Pakete verloren gehen können, in einer anderen Reihenfolge ankommen können … und zu allem Überfluss natürlich auch kaputt ankommen können. Alle diese Nachteile haben allerdings den Vorteil, dass diese Übertragungsart sehr schnell ist, denn das UDP-Protokoll muss nicht ständig die Reihenfolge der Pakete überprüfen. Auch werden keine Empfangsbestätigungen verschickt und dann ggf. Pakete mehrmals versendet.

Lidgren vereint die Stärken von UDP und TCP. Jede Nachricht, die man versendet, bekommt einen Kanal zugewiesen, der den Nachrichtentyp festlegt. Folgende Kanäle sind möglich:

  • „Unreliable unordered“ – Reihenfolge der Nachrichten ist unbestimmt; Nachrichten können verloren gehen.
  • „Reliable unordered“ – Alle Nachrichten kommen an; Reihenfolge ist unbestimmt
  • „Sequenced“ – Nachrichten können verloren gehen; Reihenfolge wird eingehalten
  • „Ordered“ – Alle Nachrichten kommen in der vorgesehenen Reihenfolge an (früher oder später)

Die Netzwerkbibliothek beherrscht darüber hinaus noch weitere Funktionen wie das kontrollierte Drosseln des Netzwerktransfers (Bandwidth Throttling), Verschlüsselung und die Zeitsynchronisation. Auch sehr interessant ist, dass man – speziell zum Testen – einen künstlichen Lag oder eine Wahrscheinlichkeit für verloren gehende Pakete definieren kann.

Vor langer Zeit habe ich mal damit beschäftigt, wie es möglicht ist mit OpenGL in mehrere Bildschirmelemente (PictureBox z.B.) zu zeichnen. Bei dem Thema bekommt man sofort die Abkürzungen  „hdc“ und „hrc“ um die Ohren geschmissen. Was es damit auf sich hat, erfährt der interessierte Leser hier …

Um OpenGL zu nutzen, benötigt man einen sogenannten Renderkontext (Handle of Rendering Context = HRC), der beim Start des Programms erzeugt werden muss. Dieser Kontext repräsentiert den Zustand von OpenGL, außerdem gehören dem Kontext auch alle Texturen und anderen Materialien an. Alles was man also mittels der API ändert oder in die Grafikkarte lädt, ist dem HRC zugeordnet.

Dieser Renderkontext ist nun verbunden mit einem Gerät (Handle of Device Context = HDC), wobei Gerät symbolisch gemeint ist. Ein HDC repräsentiert keine echten physikalischen Geräte, sondern Elemente, die auf dem Bildschirm angezeigt werden; z.B. Buttons, Zeichenbereiche oder auch Menüs. Ist OpenGL mit dem Rendering fertig, so wird das entstandene Bild auf das Gerät kopiert.

Dabei ist noch zu beachten, dass OpenGL nur auf ein HDC zeichnen kann, wenn dieses ein gültiges Pixelformat besitzt. Normalerweise wird für Grafikelemente auf der Windows-Oberfläche nie ein Pixelformat festleget. Daher müssen wir das selber tun! Und zwar mit der Funktion SetPixelFormat() … jetzt weiß OpenGL wie Farben, Transparenzwerte und andere Dinge auf dem Gerät dargestellt werden sollen.

Zurück zum Thema … ein Renderkontext ist zu jeder Zeit mit genau einem Gerät verbunden. Möchte man nun also auf ein anderes Gerät zeichnen, muss man das Gerät wechseln mit der Funktion wglMakeCurrent. Somit könnten wir nacheinander auf zwei verschiedene Geräte zeichnen und könnten sogar jeweils alle Texturen gemeinsam verwenden, da es sich stets um den gleichen Renderkontext handelt.

Ist das nicht erwünscht, muss man einen zweiten Renderkontext erzeugen, der dann eine andere unabhängige Szene darstellen kann. Dieser zweite Kontext muss jedoch in einem zweiten Thread genutzt werden, denn OpenGL legt fest: Es kann immer nur ein HRC pro Thread aktiv sein.

Ab sofort gibt es auf dieser Seite zwei neue Bereiche. Die Seite „Projekte“ stellt alle aktuellen und vergangenen Software-Projekte vor, an denen ich mitgearbeitet habe. Die Beschreibungen dazu sind teilweise noch nicht ganz vollständig, werden aber in nächster Zeit nachgeliefert …

In der Rubrik „Publikationen“ gibt es einige Artikel/Präsentationen/Dokumente von mir zum Download. Beispielsweise eine zweiteilige Artikel-Reihe zum Thema „Umstieg von Java nach C#“.

Viele kennen sicherlich die Codeanalyse von Microsoft, die auch in einige Editionen der Visual Studio Produkte integriert ist … nun gibt es eine Open Source Alternative namens Gendarme, die innerhalb des Mono Projekts entwickelt wird.

Mit Gendarme kann man Probleme in seinem .NET-Code finden und leicht beheben. Neben echten Problemem werden von dem Analyse-Tool aber auch sehr viele Vorschläge und harmlose Warnungen angezeigt, die für ein besseres OOP-Design sorgen sollen. So meckert Gendarme z.B. bei sehr langen Methoden, deckt mögliche Threading-Probleme auf und sorgt allgemein für besseren und stabileren Code.

Aktuell gibt es einen Assistenten, der nach dem Auswählen von .NET-Assemblies einen Report ausgibt. In Zukunft wird es sicherlich auch eine Integration in ausgewählte IDE’s geben, ein Addin für MonoDevelop ist bereits in Arbeit.

Nachdem ich bisher nie Probleme hatte – und sowie ein Ubuntu-Freund bin – empfahl ich einem Bekannten Ubuntu statt Windows 2000 auf seinem altem PC (ca. 400 Mhz, 256Mb) zu installieren. Leider hab ich jetzt die Erfahrung gemacht, dass Linux-Treiber für alte Hardware anscheinend nicht als zu gut sind. Dass das 56-K Modem nicht auf anhieb funktioniert, hab ich ja schon erwartet. Aber dass eine normale PS2-Maus partout nicht erkannt wird, ist schon seltsam.

Zum Glück hatten wir eine USB-Maus direkt griffbereit :-) . Nach etwas Recherche im Internet und dem Nutzen der Kommandozeile lief auch das 56K-Modem per wvdial. Anscheinend arbeitet wvdial aber nicht direkt mit der GNOME-Oberfläche zusammen, denn der Netzwerkmanager von Ubuntu bestätigt mir trotzdem vehement, ich sei offline … seine Meinung

Vor einiger Zeit bin ich auf das Open Toolkit gestoßen, einen sehr coolen OpenGL/OpenAL .NET-Wrapper. Anders als z.B. Tao funktioniert das Toolkit bei mir auch problemlos unter Linux/Ubuntu. Außerdem bietet OpenTK zusätzlich zur normalen C-API von OpenGL/OpenAL viele High-Level-Klassen. Besonders interessant ist für mich das einfache Zeichnen von Text, der dann auch noch gut aussieht.

Ein weiterer Pluspunkt: Es gibt ein Winforms-Control, was mit Mono und .NET gleichermaßen funktioniert und so erstmals die Entwicklung von CrossPlattform-OpenGL-Programmen mit .NET möglich macht.

Da es bisher kein Stable-Release gibt, sind jedoch Veränderungen der Schnittstelle an der Tagesordnung. Dafür kann man aber auch noch selber Patches einsenden, um diese zu verändern. So habe ich nun beispielsweise Unterstützung für Bezier-Kurven nachgereicht, sowie die Anbindung von Mathe-Klassen an die OpenGL-API ermöglicht.

Bekanntermaßen muss man bei vielen Matrix-Funktionen in OpenGL einen Zeiger übergeben, der auf das float[]-Array zeigt. OpenTK bringt eine Reihe von nützlichen Strukturen wie Vector3 oder Matrix4 mit, mit denen der sichere Umgang mit OpenGL problemlos möglich ist. Auch in Sprachen, die ohne Zeiger auskommen müssen – wie Visual Basic. Beispiel:

Vector3 start = new Vector3(1.0f, 0.0f, 5.0f);
Vector3 end = new Vector3(5.0f, 3.0f, -6.0f);
Matrix4 projection = Matrix4.LookAt( .);

GL.LoadMatrix(ref projection);
GL.Color4(Color.Green);

GL.Begin(BeginMode.Lines);
GL.Vertex3(start);
GL.Vertex3(end);
GL.End();

So einfach war OpenGL-Programmierung noch nie :-)

Juhuu, nur noch 32 Tage und dann erscheint die neue Ubuntu-Version „Kühner Reiher“. Die neue Version werd ich mir dann garantiert mal installieren, eventuell sogar vorher schon eine Beta-Ausgabe. Ich bin schon gespannt auf die neue GNOME-Version und natürlich auch auf den neuen Standard-Theme.Ubuntu countdown

Ich hoffe außerdem, dass in Zukunft viele gute Ideen von Ubuntu Brainstorm umgesetzt werden. Besonders die Stromsparfunktionen in Ubuntu sollten noch stark verbessert werden, wenn das stimmt, was ich gelesen habe: Akkus sind mit Ubuntu bis zu zwei mal schneller verbraucht als bei Windows XP … das darf natürlich nicht so bleiben. Besonders, weil ich mir dieses Jahr auch einen Laptop zulegen will.

Für alle Ubuntu-Interessierten hier noch ein Tipp: Am 26. April findet in Berlin eine Release-Party statt. Eintritt frei! Es gibt spannende Voträge und natürlich Musik. Organisiert wird das Ganze von der Anwendergruppe „Ubuntu Berlin“. Mehr Infos gibts hier

Unfassbar, heute ist ans Licht gekommen dass jemand einen (zugegebenermaßen recht hübschen) Macbook Air in den Müll geschmissen hat. Er lag wohl angeblich zwischen Zeitungen und landete so ausversehen zusammen mit dem Rest im Papierkorb.

Ein Glück, dass so etwas in Deutschland nicht passieren kann :-) … immerhin ist es seit 2006 verboten „Elektroschrott“ in den Hausmüll zu werfen:

„Die Verbraucherinnen und Verbraucher dürfen Geräte, die sie nicht mehr nutzen möchten, nicht in den Restmüll werfen, sondern sind ab 24. März 2006 verpflichtet, diese bei den Kommunen in die getrennte Erfassung zu geben.“ (Quelle: Bundesminesterium für Umwelt, Naturschutz und Reaktorsicherheit)

Gerade bei Produkten von Apple wäre eine Entsorgung über den Hausmüll nicht gerade umweltfreundlich, da wir ja alle wissen, dass die hübschen Macs, IPods & co nicht so grün sind, wie man denkt

Heute habe ich mir mal einen Webcast zum Thema „Wie erzeuge ich selber Symbol- und Projektvorlagen“ angeschaut. Erstaunlich einfach! Ich habe gleich mal ein Item Template gebaut, mit dem man XML-Dateien für Mono.Addins erzeugen kann.

addintemplate.png

Diese Eintrag erscheint nun wenn man auf ein Projekt rechtsklickt und dann „Hinzufügen | Neues Element“ anwählt. So kann man sich das lästige Eintippen des Grundgerüsts nun sparen.

Installation der Vorlage

1. Zip-Datei hier runterladen

2. Datei verschieben nach „Eigene Dateien/Visual Studio 2005/Templates/ItemTemplates

3. Fertig!

So und jetzt wollen wir natürlich noch sehen, was die Vorlage überhaupt erzeugt (der Name der Datei wurde im Dialog auf „My Addin“ festgelegt):

addinxml.png

Gar nicht mal so schlecht: Ich konnte genau 53 HTML-Eelemente innerhalb von 5 Minuten nennen ^^

Score beim HTML Squiz