Jul 26

Seeing#, C# 4.6 und SIMD

ProzessorSeit dem Release von .Net 4.6 am 20 Juli ist neben vielen anderen neuen Features auch der neue 64-Bit Jit Compiler RyuJIT und damit neue SIMD-Befehle (Single Instruction Multiple Data) verfügbar. Einige offizielle Infos dazu finden sich z. B. auf dem .Net Blog unter den Punkten RyuJIT und SIMD [1]. Was versteckt sich nun konkret hinter dem Stichwort SIMD bei .Net? Es handelt sich um den Namensraum System.Numerics [2]. Die darin enthaltenen Strukturen ähneln dem Vector3, Vector2, der Matrix4x4 und weiteren Strukturen, wie man sie auch in SharpDX, SlimDX oder bei mir in Seeing# wiederfindet. Der Unterschied ist, dass bei den verschiedenen Methoden – falls verfügbar – speziell optimierte Prozessorfunktionen angesprochen werden und diese damit entsprechend schneller ausgeführt werden. Weiterlesen

Jul 13

Ein Sommerloch, RKVideoMemory, SmartGlasses und Seeing#

Recon-Jet-Black-Left-AngleMein letzter Beitrag hier ist jetzt eine ganze Zeit lang her… ich betrachte das einmal ein kleines Sommerloch. Hohe Temperaturen, eine Hochzeit in der Verwandtschaft und die Urlaubszeit haben meine Aktivitäten hier stetig verhindert. In den letzten Beiträgen habe ich mich relativ viel mit Video-Verarbeitung mit der Media Foundation beschäftigt. Dies lag unter anderen an dem Spiel RKVideoMemory, welches ich für oben genannte Hochzeit als kleines Geschenk programmiert habe. Quasi ein Memory, welches alte und neue Bilder des Ehepaars als Spielkarten verwendet und beim Aufdecken das Ein oder Andere peinliche Video abspielt. Gespielt wurde dann am Tablet und angezeigt am 46″ Fernseher. War am Ende seine sehr witzige Geschichte… aber jetzt wird es wieder Zeit für andere Themen. Eines davon sieht man hier links im Titelbild: SmartGlasses. Weiterlesen

Mai 10

Direct2D-Integration in Seeing#

Direct2D SampleHeute früh habe ich mir ein paar Videos von der diesjährigen Build angesehen und bin dabei auf den Talk „Introducing Win2D“ gestoßen [1]. Über diese API habe ich zwar schon vorher gelesen, habe sie mir bis jetzt aber noch nicht tiefer angeschaut, da ich Direct2D normalerweise per SharpDX direkt von C# aus verwende. Grundsätzlich finde ich es aber sehr gut, dass Microsoft selbst an einen Weg arbeitet, die Direct2D-API über Win2D auch für C#/.Net Entwickler verfügbar zu machen. Die Performance ist super und die API der von System.Drawing sehr ähnlich. Einzig die Tatsache, dass Win2D für Universal Apps ausgelegt ist, finde ich etwas schade. In Seeing# etwa binde ich auch Direct2D ein, mache das dann aber auch für Desktop-Plattformen, also Win.Forms, WPF und Universal/WinRT. Schnelles hardwarebeschleunigtes 2D-Rendering ist schließlich auch bei Desktop-Programmen interessant. Weiterlesen

Mai 03

Wie schnell man Speicher falsch kopieren kann

MemCopyNeulich habe ich hier auf der Homepage einen Eintrag über das Lesen von Frames aus einem Video per Media Foundation geschrieben. Die Sache hat super geklappt, nur spätestens bei größeren Videos ist aufgefallen, dass die Sache schon sehr langsam und ruckelig ist. Aus diesem Grund habe ich gestern und heute etwas tiefer rein geschaut und untersucht, wo dort überhaupt die Performance verloren geht. Denn, ganz ehrlich, Performance darf auf meinem Rechner mit I7 und aktueller Radeon R9 kein Problem sein. Das Thema musste also irgendwo in meinem Coding liegen. Der Haupt-Performance-Fresser war dann mithilfe einer Leistungsanalyse in Visual Studio auch sehr schnell gefunden: Ein paar for-Schleifen. Weiterlesen

Mai 02

Logikbausteine in Seeing#

Neulich habe ich darüber geschrieben, wie Seeing# das Messenger-Pattern implementiert. Im Rahmen eines kleinen Memory-Spiels habe ich die letzten Tage damit einige kleine Logig-Komponenten umgesetzt, an denen das Pattern relativ gut funktioniert. In diesem Artikel geht es beispielsweise um eine Komponente, welche sich um das Aufdecken von Karten und das Erkennen von richtigen oder falschen Paaren kümmert und darauf entsprechend die Karten wieder verdeckt oder eine Folgelogik wie z. B. „Punktzahl hochzählen“ antriggert. Der Screenshot links gibt schon mal eine grobe Übersicht über die hier eingesetzten Klassen. Weiterlesen

Apr 28

FrozenSky umbenannt in Seeing#

RenameAm letzten Wochenende habe ich mein OpenSource-Projekt FrozenSky umbenannt in Seeing#. Der Grund ist schlicht der, dass der Begriff FrozenSky im Prinzip gar nichts mit der Sache zu tun hat, welche sich hinter dem Projekt verbirgt. Es geht um ein Multimedia-Toolkit für C# mit Schwerpunkt auf 2D- und 3D-Grafiken. Ich wollte einen Namen haben, der entsprechend besser zu diesem Thema passt. Nach etwas Überlegung ist mir dann die Variante „Seeing#“ eingefallen. Passt denke ich ganz gut, das # (gesprochen „Sharp“) zeigt am ersten Blick, dass es sich um eine Technologie für .Net / C# handelt. Das „Seeing“ soll verdeutlichen, dass es um das Sehen geht. Zwar sehr allgemein, ich denke aber, es passt trotzdem relativ gut. Anfangs war ich nicht ganz sicher, wie viel Aufwand mir ein solcher Namenswechsel macht – wirkt er sich doch auf die Homepage, auf GitHub und auf das Coding selbst massiv aus. Am Ende war es aber an einen Vormittag nebenbei gut fertig zu machen.

Apr 19

Videos per SourceReader der MediaFoundation lesen

Mein letzter Beitrag auf dieser Seite hatte das Schreiben von Videos per Media Foundation zum Thema, in diesem hier geht es entsprechend um das Lesen. Auch hier habe ich mich an die Vorlagen von Microsoft gehalten, beispielsweise dieses kurze Tutorial [1]. Die Klasse SourceReader der Media Foundation ist hierbei Dreh- und Angelpunkt. Mit ihr kann man eine neue Video-Datei anlegen und entsprechend alle Video-Frames einzeln übergeben. Alles nichts weltbewegendes, letzten Endes hat es mir aber trotzdem ein paar Tage gekostet, die Sache ordentlich zum Laufen zu kriegen. Wer denkt auch daran, dass Alpha-Werte vom SourceReader ignoriert werden? Weiterlesen

Apr 12

Videos per SinkWriter der MediaFoundation schreiben

Aktuell arbeite ich in Vorbereitung für ein kommendes (Hobby-)Projekt wieder verstärkt mit der Media Foundation von MS. Erster Schritt war nun, per SinkWriter Videos direkt aus der 3D-Ansicht von Seeing# heraus schreiben zu können. Der zweite Schritt, Videos auch wieder auszulesen, ist noch in Arbeit [1]. Der SinkWriter ist eine Klasse der Media Foundation, welche dazu verwendet werden kann, von der Anwendung generierte Bilder direkt in eine Videodatei zu schreiben. Soll ein Video also etwa 30 Frames pro Sekunde haben, so kann die Anwendung eben diese 30 Frames pro Sekunde erzeugen und an den SinkWriter übergeben. Mein aktueller Stand ist damit der, dass ich direkt aus dem 3D-Rendering heraus nebenbei ein Video schreiben lassen kann. Weiterlesen

Apr 05

Parameterprüfungen zur Laufzeit

Programmierfehler sollen auffallen, und zwar so bald wie möglich! So banal, wie dieser Satz klingt, so leicht drückt man sich um das Kernthema herum. Ich kann mich noch gut daran erinnern, wie ich früher mit den Gedanken entwickelt habe: Auslösen von Exceptions vermeiden, Aufpoppen von Fehlermeldungen vermeiden, … Getrieben von diesen Vorsätzen programmiert man Methoden beispielsweise so, dass im Fehlerfall ein Default-Wert zurückgegeben wird, welcher sicherstellen soll, dass das Programm halt doch noch irgendwie weiterläuft und niemand etwas merkt. Im Extremfall tauchen leere Catch-Blöcke auf oder es wird (wenigstens) in eine Protokolldatei reingeschrieben, in die sowieso nie jemand reinschaut. Zunächst einmal hat es ja etwas Gutes, dass Programm stürzt nicht ab, wirkt sogar stabil. Aber… irgendwann wird man von der Zeit eingeholt und man hat ein echtes Problem, die tatsächlichen Fehler im Hintergrund zu finden und auszumerzen. Weiterlesen

Apr 03

Der Messenger in Seeing#

In Vorbereitung für ein neues Spiel habe ich heute die Kern-Logik von Seeing# an ein paar Stellen erweitert. Wichtigster Punkt dieser Tage ist der Messenger, welcher in den Klassen von Seeing# als SeeingSharpMessenger bezeichnet wird. Ursprünglich habe ich mich bei dem Konzept etwas vom EventAggregator des Prism-Frameworks inspirieren lassen [1]. Grundsätzlich geht es darum, eine gemeinsame Klasse zu haben, an der sich Ereignis-Empfänger registrieren können, um so Ereignisse von beliebigen Quellen der Anwendung zu empfangen, ohne diese Quellen selbst zu kennen. Bei Seeing# habe ich dieses im Grunde sehr einfache Prinzip hauptsächlich dahingehend erweitert, damit es besser mit verschiedenen Threads innerhalb des Programms umgehen kann. Weiterlesen