` Die Debugging-Werkzeuge

Übersicht


Die Debugging-Werkzeuge

Bei der Fehlersuche in einer komplexen Schaltung geht es oft um die Überprüfung, ob und wenn ja, welche Werte zwischen den Nodes ausgetauscht werden. Stimmen die Datentypen und liegen die übergebenen Werte innerhalb des erwarteten Bereichs für nachfolgende Berechnungen?

Um diese Arbeitsschritte zu vereinfachen, stehen verschiedene Funktionen zur Verfügung, um Datentypen und Werte an Ports direkt ablesen zu können.

Die Info-Box

Die Info-Box zeigt direkt im Node-Editor Informationen zu selektierten Nodes und Ports an.

Die offensichtlichste Option stellt dabei ein grau unterlegter Bereich links unten im Node Editor dar. Hier können Sie den Namen eines selektierten Nodes ablesen und ggf. auch den Typ des Nodes bzw. Assets. Wenn an dem Node ein Port ausgewählt wird kann hier zudem auch dessen Datentyp und oft auch dessen Wert abgelesen werden. Da bei komplexeren Datentypen, wie z.B. Vektoren oder Matrizen gleich mehrere Zahlenwerte übertragen werden, kann der Platz für die vollständige Darstellung aller Werte in dem Info-Bereich knapp werden. Daher lässt sich der Info-Bereich auch durch Ziehen an seinem rechts Rand mit der Maus skalieren.Zudem kann ein Rechtsklick auf den angezeigten Wert ausgeführt werden und Sie können die Werte in die Zwischenablage kopieren lassen. Beim Einfügen z.B. in den Kommentarbereich des Nodes, lassen sich dann alle Zahlenwerte ablesen.

Der Daten-Inspektor

Daten-Inspektor...

Die Datentypen und Werte ausgewählter Ports lassen sich in einem separaten Daten-Inspektor anzeigen. Dieser kann z. B. durch Ziehen eines Ports in einen leeren Bereich und Auswahl von 'Daten-Inspektor' geöffnet werden (links im Bild zu sehen).

Die zweite Option umgeht dieses Platzproblem bei der Darstellung größerer Datenmengen. Dazu führen Sie auf einen Port einen Rechtsklick aus und wählen in dem Kontextmenü den "Daten-Inspektor" aus. Ebenso können Sie einfach eine Verbindungslinie von einem Port in einen leeren Bereich des Node-Editors ziehen. Nach dem Lösen der Maus öffnet sich ebenfalls ein Kontextmenü, über das sich der Daten-Inspektor auswählen lässt. Zudem kann der Daten-Inspektor direkt über das Debug-Menü des Node-Editors geöffnet werden.
Es öffnet sich ein separates Fenster, in dem der Datentyp und auch die an dem Port anliegenden Werte abgelesen werden können. Um den Überblick zu behalten, von welchem Port die Werte angezeigt werden, erscheint zudem neben dem Port ein kleines Dialog-Icon (auf der rechten Seite der obigen Abbildung zu erkennen). Es lassen sich nämlich auch problemlos die Werte gleich mehrerer Ports an einem Node in dem Inspektor anzeigen. Dieser verfügt dafür über ein eigenes Aufklappmenü in der Kopfzeile, wo zwischen den verschiedenen Ports ausgewählt werden kann. Die Auswertung der Portwerte für den Inspektor kann durch einen Rechtsklick auf einen ausgelesenen Port und erneute Auswahl von "Daten-Inspektor" wieder beendet werden. Ebenso kann das Mülleimer-Icon direkt im Daten-Inspektor angeklickt werden, um die gerade angezeigten Port-Daten wieder aus der Anzeige zu entfernen. Noch schneller ist jedoch häufig das Anklicken des X-Symbols an dem Icon neben dem jeweiligen Port. Auch so lässt sich die Übertragung der betreffenden Portwerte an den Daten-Inspektor wieder ausschalten. Zudem finden Sie im Debug-Menü des Node-Editors auch den Alle Daten-Ispektoren entfernen-Befehl, mit dem alle Ports der Schaltung wieder vom Daten-Inspektor gelöst werden können.


Interaktiver Modus

Oft kann es hilfreich sein, einen kurzen Blick auf die gelieferten Daten eines Ports zu werfen. Dafür muss nicht extra eine feste Verbindung des Ports zum Daten-Inspektor hergestellt werden, denn dieser bietet auch einen interaktiven Modus an, den Sie über das Quadrat-Icon in seiner Kopfzeile aktivieren können (drittes Icon von rechts).

Nach Aktivierung des interaktiven Modus im Daten-Inspektor werden immer nur die Daten des aktuell selektierten Ports angezeigt.

Wie in obiger Abbildung zu erkennen, werden in diesem Modus vorhandene Port-Markierungen für den Daten-Inspektor ignoriert und das Umschalt-Menü für die markierten Ports im Kopfbereich des Daten-Inspektors wird deaktiviert. Es werden nur noch die Daten des aktuell selektierten Ports angezeigt. Dazu reicht ein Klick auf den Namen eines Ausgang-Ports aus. In der obigen Abbildung werden so z. B. die Geometriedaten eines Kapsel-Grundobjekts ausgegeben.
Sollen zusätzlich Werte von markierten Ports ausgegeben werden, kann ein zusätzlicher Daten-Inspektor z. B. über das Debug-Menü des Node-Editors aufgerufen werden.


Kompakter/Manueller Modus

Einige Datenstrukturen können sehr komplex sein. Denken Sie z. B. an die Geometrie-Informationen, die sowohl die Punktkoordinaten als auch die Punktnummern verwalten müssen, die mit Linien und Polygonen zu verbinden sind. Zudem sind an einer Geometrie oft noch UV-Koordinaten oder Selektionen vorhanden, die ebenfalls in diesem Datenformat gesichert sind. Der Daten-Inspekor bietet bei solchen Datentypen zusätzliche Modi an, wie solche Daten angezeigt werden sollen. Sie finden die entsprechende Umschaltmöglichkeit dann am unteren Rand des Inspektors:


Die gewünschten Daten können in einem Drop-Down-Menü am unteren Rand des Inspektors ausgewählt werden. So zeigt die Abbildung z. B. die Daten eines Geometrie-Ausgangs an. Oben wurden einzelne Punktkoordinaten, darunter die Punktnummern der Polygone für die Ausgabe selektiert. Automatisch erfolgt auch die Ausgabe von Informationen über gespeicherte Selektionen des entsprechenden Elementtyps. Auf gleiche Weise lassen sich z. B. auch die UV-Koordinaten anzeigen.

Der Port-Inspektor

Die Werte ausgewählter Ports lassen sich auch direkt neben den Ports anzeigen.

Die dritte und direkteste Option zum Anzeigen von Portwerten lässt sich ebenfalls nach einem Rechtsklick auf einen Port aktivieren. Dazu führen Sie wieder einen Rechtsklick auf den entsprechenden Port aus und wählen diesmal den "Port-Inspektor" im Kontextmenü aus. Alternativ hierzu können Sie auch eine Verbindungslinie von einem Port ziehen und diese im leeren Raum des Node-Editor fallenlassen. Auch hierbei erscheint ein Kontext-Menü, über das Sie den Port-Inspektor für diesen Port anzeigen können.
Der Wert des Ports lässt sich nun direkt in einem Feld neben dem Port ablesen. Dies funktioniert sogar für umfangreichere Datentypen, wie Vektoren, Matrizen und Farben. Über das beschriebene Kontextmenü können Sie die Darstellung des Werts an dem Port jederzeit wieder deaktivieren, oder aber Sie klicken einfach auf das X-Symbol. das am linken Rand der angezeigten Werte zu sehen ist.


Die Konsolenausgabe

Alle vorgenannten Funktionen haben den Nachteil, dass immer nur aktuelle Werte angezeigt werden. Die Entwicklung eines Werts, Z. B. ob dieser während der Animation größer oder kleiner wird, kann so nicht direkt nachvollzogen werden. Für diese Fälle lassen sich Werte auch an die Konsole schicken, wo sie in einer fortlaufenden Liste angezeigt werden. Hierzu muss ein Konsolenausgabe-Node in eine bestehende Verbindung integriert werden. Der durchgeleitete Wert erscheint dann automatisch in der Konsole. Die Konsole ist automatisch im Node-Layout von Cinema 4D enthalten. Ansonsten kann sie auch jederzeit direkt über das Erweiterungen-Menü von Cinema 4D geöffnet werden.

Die Konsolenausgabe schickt durchgeleitete Werte als Strings an die Konsole.

Weitere Informationen zur Konsole finden Sie in diesem Abschnitt. Zudem ist hier die vollständige Erklärung des Konsolenausgabe-Nodes zu finden.

Die Heat-Map

Wenn es um komplexe Node-Schaltungen oder das Erzeugen von Asset-Kapseln geht, kann es hilfreich sein, die Leistung einer Schaltung zu optimieren. Damit dies überhaupt möglich ist, benötigen wir ein Werkzeug, dass uns die Berechnungszeit jedes Nodes innerhalb der Schaltung anzeigen kann. Exakt dies ist eine Heatmap.

Die Aktivierung der Heatmap führt zu einer farblichen Markierung der Nodes und zur Einblendung von Prozentwerten unter den Nodes.

Zum Aktivieren der Heat-Map rufen Sie den gleichnamigen Befehl im Debug-Menü des Node-Editors auf. Daraufhin erfolgt eine Farbänderung am unteren Rand aller Nodes, anhand der Sie bereits den relativen Rechenbedarf des Nodes innerhalb eines Aktualisierungszyklus der Schaltung ablesen können. Die Farben variieren dabei standardmäßig ausgehend von Blau und Grün, als Markierung für einfache und sehr schnell zu berechnende Nodes, über Gelb, bis hin zu Orange für schrittweise komplexer werdende Berechnungen. Die Farbe Rot ist hier für die Nodes mit dem größten Zeitbedarf reserviert. Eine Schwarzfärbung ist standardmäßig für die Nodes vorgesehen, die entwerder keine aktiven Verbindungen zum Rest der Schaltung haben oder aber statische Berechnungen durchführen, die nur ein Mal ausgeführt werden müssen. In der obigen Abbildung erkennen Sie dies z. B. am Begrenzen-Node. Der eingetragene Wert wird dort daher nur einmalig überprüft und dann für alle folgenden Berechnungszyklen der Schaltung unverändert ausgegeben. Eine fortlaufende Neuberechnung solcher Nodes ist daher nicht nötig, da sie als statisch angesehen werden.
Wenn Sie ein anderes Farbschema für die Kennzeichnung der Berechnungszeiten der Nodes bevorzugen, finden Sie dazu entsprechende Vorgaben in den Programm-Voreinstellungen und deren Node-Editor-Rubrik.

 

Die Farbmarkierung der Nodes während der Heatmap-Auswertung kann individuell über einen Fabverlauf und einen separaten Farbwert für statische Nodes in den Programm-Voreinstellungen eingestellt werden.

Zusätzlich zu den Farben werden auch Prozentwerte am unteren Rand der Nodes eingeblendet, die den Rechenbedarf des Nodes bezogen auf die Gesamtschaltung oder bezogen auf die Nodes innerhalb der gleichen Pfadtiefe angeben. Diese Unterscheidung treffen Sie über die Option Heat-Map relativer Modus, die ebenfalls im Debug-Menü zu finden ist. Die folgende Abbildung macht die Wirkung dieser Option deutlich.

Je nach relativer oder absoluter Auswertung der Heat-Map, erscheinen unterschiedliche Prozentwerte für die Nodes, die in Gruppen verwendet werden.

Im oberen Bereich erkennen Sie die Hauptschaltung, in der auch eine Gruppe verwendet wird (Geometriemodifikationsgruppe). In dieser Hauptebene der Schaltung spielt es keine Rolle, ob der relative Modus der Heat-Map aktiv ist oder nicht. Die angezeigten Prozentwerte summieren sich immer zu 100% und zeigen dadurch den prozentualen Anteil jedes Nodes bzw. jeder Gruppe an der Gesamtschaltung an. Öffnet man jedoch eine Gruppe und steigt dadurch innerhalb des Node-Pfads eine Stufe nach unten, wird der Unterschied deutlich (siehe untere Hälfte der Abbildung).

Unten links ist der standardmäßig aktive, relative Modus zu sehen. Die Heat-Map-Werte der Nodes innerhalb der Gruppe addieren sich ebenfalls wieder zu 100%. Die Werte werden hierbei also nur auf die gerade sichtbare Node-Ebene bezogen. Recht unten zeigt die Abbildung das Ergebnis mit ausgeschaltetem relativen Modus. Die Prozentwerte werden im Kontext der Gesamtschaltung, also absolut berechnet und ergeben dadurch summiert wieder den Wert, den wir bereits in der Totalen der Schaltung an der Gruppe ablesen konnten.


Die Heat-Map auswerten

Die Färbungen und Prozentwerte geben bereits einen Hinweis darauf, welche Elemente der Schaltung den Großteil der Berechnungszeit beanspruchen. Dies muss jedoch im Kontext betrachtet werden. Ein Grundobjekt-Node mag zwar in der Schaltung z. B. rot markiert sein, ist jedoch einerseits schnell zu berechnen und lässt sich auch nicht durch andere Nodes ersetzen. Es gibt hier also keinen Optimierungsbedarf. Es kommt also vor allem auf den absoluten Zeitbedarf für die Berechnung an. Diese Daten können wir mit dem Befehl Heat-Map drucken in der Konsole als Text anzeigen lassen. Hierzu muss die Heat-Map nicht zwingend aktiv sein.
Sofern das Nodes-Layout verwendet wird, ist die Konsole bereits im Layout zu sehen. Ansonsten können Sie das Konsole-Fenster über das Fenster-Menü öffnen lassen. Die folgende Abbildung zeigt eine beispielhafte Ausgabe der Heat-Map-Daten dort.

Beispiel für die Ausgabe von Heat-Map-Daten in der Konsole.

Die Ausgabe im Nodes-Bereich der Konsole unterteilt sich in vier Rubriken:

  1. Nodes
    Hier werden alle Nodes und Gruppen aufgelistet, zusammen mit ihren absoluten (Abs%) und relativen (Rel%) Heat-Map-Werten, sowie den tatsächlichen Zeiten (Time), die für die Berechnung anfallen. Zudem können Sie in der vierten Spalte die interne Kennung bzw. der Node-Pfad zu jedem Element ablesen. Dies ist hilfreich, denn dieser Pfad lässt sich mit der Maus markieren, über Ctrl+C in die Zwischenablage kopieren und dann in das Pfad-Suchfeld kopieren. Dazu klicken Sie auf das Lesezeichen-Icon im Kopfbereich des Node-Editors. Es öffnet sich ein Eingabefenster für den Node-Pfad.
    Pfadeingabe zu einem Node

    Die Darstellung im Node-Editor springt dadurch genau zu dem angegebenen Node, selbst wenn dieser in tieferen Node-Ebenen, also innerhalb von Gruppen verwendet wird. Zudem wird der entsprechende Node automatisch selektiert, was das Auffinden in komplexen Schaltungen zusätzlich erleichtert.
    Innerhalb der Konsole sind zudem hinter jedem Eintrag in der Nodes-Gruppe der Heat-Map-Ausgabe einige Schlüsselbegriffe samt boolschen Werten (true oder false) abzulesen:
    • isGroup: Die Werte true (wahr) oder false (falsch) zeigen hier an, ob es sich bei dem Eintrag um einen Gruppe-Node oder einen normalen Node handelt
    • hidden: Die Funktion eines Nodes kann intern durch weitere Nodes gebildet werden, die der Nutzer selbst nicht im Node-Editor sehen kann. Wenn es sich bei einem gelisteten Nodes um so einen, für den Nutzer unsichtbaren Node handelt, wird hierfür true angezeigt, ansonsten false.
    • convSrc: Dieser Wert zeigt an, ob an dem entsprechenden Node eine Datenkonvertierung stattfindet oder nicht. Dies kommt immer dann vor, wenn Ports miteinander verbunden werden, die eigentlich unterschiedliche Datentypen bereitstellen, wie z. B. Integer und Bool. Das Node-System berechnet in diesen Fällen eine automatische Konvertierung, die jedoch zusätzliche Zeit beansprucht. Falls möglich, sollte daher zur Optimierung einer Schaltung auf vermeidbare Konvertierungen verzichtet werden. Dies betrifft vor allem die Konvertierung großer Datenmengen, wie es z. B. bei der Verarbeitung von Arrays vorkommen kann.
  2. Analysis
    Dieser Bereich gibt eine Zusammenfassung zu der Node-Anzahl der Schaltung und der Berechnungszeit wieder:
    • Timestamp: Hier wird ein interner Zeitwert angegeben, zu dem die Auswertung der Heat-Map erfolgt ist.
    • Frames: Diese Angabe bezieht sich auf den Zeitbereich, zu dem die Schaltung für die Heat-Map ausgewertet wurde. Diese Zeit wird als Bildbereich der Szene ausgegeben, also z. B. Frame (0 to 1) für die Auswertung des Zeitbereichs, der zwischen Bild 0 und Bild 1 der Zeitleiste liegt.
    • User Nodes: Hier wird die Gesamtzahl der durch den Nutzer für die Schaltung angelegten Nodes ausgegeben. Da Nodes intern aus (unsichtbaren) weiteren Nodes bestehen können (siehe auch hidden-Markierung innerhalb der Nodes-Auflistung), kann die eigentliche Anzahl der zu berechnenden Nodes durchaus viel größer sein, als hier angegeben.
    • Executed User Nodes: Dies ist die Anzahl der durch den Nutzer selbst erstellten Nodes, die innerhalb der Schaltung zur Berechnung der Heat-Map ausgewertet wurden. Diese Anzahl kann geringer sein, als bei User Nodes angegeben, z. B. wenn blau markierte Nodes vorhanden sind, die nur einmalig berechnet werden müssen oder über keine Verbindungen verfügen.
    • Total Nodes: Dies ist die tatsächliche Anzahl aller zu berechnenden Nodes in der Schaltung. Hier sind also die nur intern verwendeten und für den Nutzer unsichtbaren Nodes enthalten.
    • Execution Time: Dies gibt die für die Berechnung der gesamten Schaltung benötigte Zeit wieder.
  3. Hottest Nodes
    Hier werden die Nodes und Gruppen aufgeführt, auf die der Großteil der Berechnungszeit entfällt. Wie bereits bei der Nodes-Kategorie werden auch hier prozentualie Relativ- und Absolutwerte, sowie die tatsächlichen Berechnungszeiten angegeben.
  4. Hottest Conversions
    In dieser Kategorie finden Sie die Nodes und deren Ports, an denen die aufwändigsten Datenkonvertierungen berechnet werden müssen. Die vorangestellten Prozentwerte geben Absolutwerte für die Komplexität der jeweiligen Konvertierungsberechnung bezogen auf alle in der Schaltung benötigten Konvertierungen an.


Detaillierte Heat-Map ausgeben

Die Ausgabe der Heat-Map-Informationen in der Konsole kann noch detaillierter als oben beschrieben erfolgen. Dazu halten Sie beim Aufruf von Heat-Map drucken zusätzlich die Shift-Taste gedrückt. Die folgende Abbildung zeigt ein mögliches Ergebnis an.

Ausführliche Ausgabe von Heat-Map-Daten in der Konsole.

Besonders auffällig ist die umfangreichere Anzahl und Darstellung von Informationen in der Kategorie Nodes Deep. Hier erscheinen nun auch viele der ansonsten vom Nutzer versteckt gehaltenen Nodes, die anhand der hidden (true)-Markierung zuerkennen sind.

Als zusätzliche Information ist an allen Einträgen dort auch die Ausgabe von absNoConvvorhanden, an der Sie die absolute Berechnungszeit unter Ausschluss der Datenkonvertierungen an seinen Ports ablesen können. Sind an einem Node die Werte für Abs% (erste Spalte der Auflistung) und absNoConv identisch, geht an dem entsprechenden Node also keine Berechnungszeit für Datenkonvertierungen verloren.

Auch in der Analyse-Rubrik gibt es im detaillierten Modus zusätzliche Informationen:

Alle übrigen Ausgaben des detaillierten Modus wurden bereits bei der Besprechung des Standardmodus hier beschrieben.