17 Dezember 2019

Worklog Seeing# 2: Rolle rückwärts

Eineinhalb Jahre ist es nun her, als ich mit Seeing# 2 begonnen habe. Mit einigen Pausen-Zeiten dazwischen hat sich in der Zwischenzeit einiges verändert. Damals habe ich mir zum Ziel gesetzt, die Abhängigkeit auf SharpDX nicht mehr zu verschleiern und damit dem Nutzer von Seeing# mehr Flexibilität zu geben. Heute ist es aber leider so, dass SharpDX nicht mehr weiterentwickelt wird [1] und somit früher oder später durch eine andere Alternative ersetzt werden muss. Aus diesem Grund habe ich mich hier für einen Mittelweg entschieden.

Mathematik mit System.Numerics

Der erste Schritt war, anstelle der Mathematik-Funktionen von SharpDX wieder auf System.Numerics zu gehen. Das, was System.Numerics nicht bietet, habe ich händisch dazuprogrammiert oder mir direkt aus dem SharpDX-Projekt gezogen (entsprechende Verweise sind im Quellcode). Grundsätzlich also genau so, wie bereits in Seeing# 1. Somit hier die erste Rolle Rückwärts. Interessanterweise hatte diese Änderung sogar eine kleine negative Konsequenz, und zwar wurden 3D-Texte auf der UWP nicht mehr korrekt erzeugt (Siehe nächster Screenshot).

Rendering 3D-Text auf der UWP nach Umstellung auf System.Numerics

Auf den anderen Plattformen (Wpf, Win.Forms, .Net Core, Full Framework) sah das gleiche Beispielprogramm dagegen wie gewohnt aus. Nach längerem Suchen war der Grund die Genauigkeit beim Vergleich zweier Vektoren innerhalb der Triangulation der Text-Shapes. Vorher wurde direkt verglichen, jetzt nach meinem Bugfix mit der Methode EqualsWithTolerance. Letzteres ist an der Stelle ja grundsätzlich richtiger, da diese zwei Vektoren auch dann noch als gleich betrachtet, wenn sie sich in ihren Komponenten um 0,00001 unterscheiden. Schließlich können nach Berechnungen von Fließkommazahlen jederzeit solche kleinen Unterschiede entstehen. Warum es sich am Ende aber auf UWP anderes verhält wie auf den anderen Plattformen, ist mir aber nicht wirklich klar geworden.

SharpDX-Objekte auf öffentliche „Internals“-Eigenschaften

Diese Überschrift klingt jetzt auf den ersten Blick eher blöd, ein besserer einleitender Satz ist mir jetzt aber ad-hoc auch nicht eingefallen. Grundsätzlich mache ich in Seeing# 2 jetzt folgendes: SharpDX-Objekte sind nach wie vor nicht direkt öffentlich sichtbar. Stattdessen haben manche Klassen von Seeing# jetzt eine Eigenschaft „Internals“, über die man auf die darunter liegenden SharpDX-Objekte zugreifen kann. Nachfolgendes Beispiel zeigt den Zugriff auf das hinter einem EngineDevice liegende Direct3D 11 Device.

EngineDevice engineDevice;

...

// Get references to current render device
D3D11.Device renderDevice = engineDevice.Internals.DeviceD3D11_1;

Nächste Schwierigkeit war, sicherzustellen, dass diese Konvention auch über ganz Seeing# 2 hinweg eingehalten wird. Als Hilfsmittel dazu habe ich mir ein Consolen-Programm geschrieben, welche die Seeing#-Dlls per Mono.Cecil auswertet und bei Missachtung der genannten Konvention eine Meldung in das Consolen-Fenster schreibt [2]. Nachfolgender Screenshot zeigt die Ausgaben des Programms. Später wäre es noch interessant, dieses Tool direkt in den Build zu integrieren. Für den ersten Schritt hat ein separates Consolen-Programm aber erst einmal gereicht.

Consolen-Programm zur Prüfung, ob SharpDX-Verweise öffentlich sichtbar sind

Fazit

Insgesamt war ich mit den Anpassungen relativ schnell durch, es ging ja nicht um Grundlegende Änderungen. Interessant wird es für die spätere Zeit noch, wie man mit SharpDX umgeht. Direct3D 11 an sich hat aus meiner Sicht einen sehr guten Stand. Wie es mit Direct3D 12 und darüber hinaus aussieht ist dagegen eine ganz andere Frage. Früher oder später muss man sich wohl Gedanken über eine Alternative zu SharpDX machen.

Verweise
[1] – https://github.com/sharpdx/SharpDX
[2] – https://github.com/RolandKoenig/SeeingSharp2/tree/master/Tools/SeeingSharp.StaticChecks


Schlagwörter: ,
Copyright 2019. All rights reserved.

Verfasst 17. Dezember 2019 von Roland in category "Seeing# 2

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.