Entwickler-Tagebuch

Alle aktiven EintrĂ€ge chronologisch am StĂŒck.

19. April 2026

Neue Objekt-Boundaries und verbessertes Snapping

Im Spatial Workspace unserer UI-Engine geht es stetig voran. Nachdem wir in den letzten Tagen die Performance bei tausenden Objekten gesichert haben, lag der Fokus heute auf einem entscheidenden Detail der rÀumlichen Interaktion: Wie exakt beanspruchen Objekte ihren Platz im Raum und wie verhalten sie sich, wenn sie aufeinandertreffen?

Visualisierung der neuen Objekt-BoundariesAbb 1: Die neuen Boundaries schließen das eigentliche Frame und die dazugehörige Caption in eine gemeinsame Bounding-Box ein.

Das Problem mit den Beschriftungen

Bisher lag der Fokus der Kollisions- und Layout-Logik primĂ€r auf dem eigentlichen Fenster (dem Frame). Das fĂŒhrte in der Praxis allerdings zu visuellen und logischen Unsauberkeiten: Sobald ein Objekt eine Beschriftung (die Objcaption) besaß, die ĂŒber das visuelle Haupt-Frame hinausragte, wurde dieser Platz vom System nicht vollstĂ€ndig respektiert. Beim Andocken von Fenstern konnte es passieren, dass Frames die Texte benachbarter Objekte ĂŒberlagerten.

Erweiterte Objekt-Boundaries

Um das zu lösen, haben wir die Berechnung der Bounding-Boxen umgeschrieben. Die neuen Objekt-Boundaries umschließen nun konsequent das gesamte Element: Sie fassen das Haupt-Frame und die Objcaption zu einer gemeinsamen, logischen Einheit zusammen. Die Engine "weiß" nun exakt, wie viel Raum ein Objekt mitsamt seiner Metadaten und Titel wirklich benötigt.

Die neue Grundlage fĂŒr das Snapping-System

Diese architektonische Anpassung ist weit mehr als nur ein optischer Fix. Die neuen Boundaries bilden ab sofort die exakte mathematische Grundlage fĂŒr die Snappings zwischen den Frames.

Wenn Nutzer nun Virtual Windows im 3D-Raum verschieben und diese aneinander andocken, greift das Constraint-System auf die erweiterten Bounding-Boxen zurĂŒck. Das Andocken passiert exakt an den Außenkanten dieser neuen Geometrie – was zu einer völlig neuen, flĂŒssigen Gruppendynamik fĂŒhrt.

Rasten beispielsweise die drei Masken-Frames aneinander ein, bilden sie fortan einen kohÀrenten Verbund. Zieht man nun an einem dieser Frames, gleiten die anderen beiden durch die magnetische Bindung nahtlos und synchron mit durch den Raum. Das angrenzende Texteditor-Frame hingegen ist von diesem System bewusst ausgenommen; es bleibt stets ein autarkes, frei platzierbares Element, das sich nicht in diesen Bewegungsfluss einklinkt.

Das Ergebnis ist ein extrem sauberes Layout-Verhalten ohne ĂŒberlappende Texte. Das visuelle Element der Caption ist endgĂŒltig zu einem vollwertigen, berechenbaren Teil der rĂ€umlichen Geometrie geworden.

18. April 2026

Application Binary Interface (ABI) und Plugin-Systeme als GeschÀftsmodell

Eine binÀre Kooperation ist eine Form arbeitsteiliger Produktentwicklung. Partei A liefert ein kompiliertes Library-Artefakt, Partei B integriert dieses Artefakt in Anwendung, Workflow und UI. Distribuiert wird ein ebenfalls kompiliertes Gesamtprodukt.

Der ökonomische Kern liegt in der Trennung von Benutzbarkeit und Implementierungswissen. Geliefert wird nicht Quelltext, sondern anschlussfĂ€hige FunktionalitĂ€t. VergĂŒtet wird nicht Einsicht in die innere Struktur, sondern die Möglichkeit, ein fremdes Modul kontrolliert in eine eigene Wertschöpfungskette einzubauen.

Teil 1: Die technische Basis – ABI und Opaque Handles

Technisch ist dafĂŒr nicht nur eine API relevant, sondern vor allem eine stabile ABI (Application Binary Interface, also die BinĂ€rschnittstelle eines bereits kompilierten Moduls). WĂ€hrend eine API die sichtbaren Funktionen und Typen auf Quelltextebene beschreibt, regelt die ABI die tatsĂ€chlich relevante BinĂ€rvertrĂ€glichkeit: Aufrufkonventionen, Speicherlayout, Symbolsichtbarkeit, Ownership-Regeln, Fehlertransport und VersionskompatibilitĂ€t.

Das Opaque-Handle-Pattern ist in diesem Zusammenhang kein Stilmittel, sondern ein Instrument der Kopplungskontrolle. Außen sichtbar ist nur ein undurchsichtiger Handle auf internen Zustand. Außen unsichtbar bleiben Datenlayout, Hilfstypen, Containerwahl und Invarianten. Operationen auf diesem Zustand laufen ausschließlich ĂŒber exportierte Funktionen. Damit verbleiben Speicherhoheit, Strukturwissen und Refactoring-Freiheit beim Lieferanten.

Das Ergebnis ist eine klare funktionale Aufteilung: Rechenkern auf der einen Seite, UI und Produktkontext auf der anderen. Das begrenzt die technische AngriffsflÀche der Kooperation auf eine definierte BinÀrschnittstelle.

Teil 2: Die offene Plattform – Standards setzen (Open Source)

In der Praxis mĂŒndet dieses Architekturmuster fast immer in einem Plugin-System. Es entstehen zwei klare Rollen: Der Host (die Plattform), der Rahmen und Routing stellt, und das Plugin (die Erweiterung), das als dynamische Bibliothek (.so / .dll) exakt die ABI-Schnittstelle bedient.

In der Open-Source-Welt wird der Host oft frei zur VerfĂŒgung gestellt, um einen Standard zu etablieren. Bekannte Beispiele finden sich dort, wo klare Schnittstellen auf hochspezialisierte Anforderungen treffen: Der populĂ€re Netzwerkanalysator Wireshark bindet komplexe oder proprietĂ€re Protokoll-Parser (Dissectors) als dynamische .so-Bibliotheken tief in seine Engine ein. Auf dem modernen Linux-Desktop lĂ€dt der performante Wayland-Compositor Hyprland neue Fenster-Management-Regeln als native BinĂ€r-Plugins direkt in seinen Kern. Und auch im hochskalierenden Web-Bereich greift dieses Muster: Der Webserver Nginx erlaubt es, rechenintensive Filter oder Security-Regeln von Drittanbietern als nativ kompilierte Dynamic Modules direkt in die Verarbeitungspipeline einzuhĂ€ngen.

Das GeschĂ€ftsmodell hier: Die offene Kern-Plattform gewinnt massive Marktanteile, wĂ€hrend spezialisierte Firmen kommerzielle, proprietĂ€re Module in dieses Ökosystem verkaufen können.

Teil 3: Das doppelte Geheimnis – Industrielle MaßstĂ€be (Closed Source)

Das Prinzip der ABI-Kooperation entfaltet sich besonders ausgeprĂ€gt im rein proprietĂ€ren (Closed-Source) Sektor. Hier greift das Prinzip der gegenseitigen IP-Abschirmung: Der Host-Entwickler gibt ausschließlich eine C/C++ Header-Datei (die ABI-Dokumentation) heraus. Es gibt keinen Quellcode – beide Seiten kommunizieren als kompilierte Blackboxen miteinander.

Dieses Modell sichert in der Industrie gigantische MĂ€rkte ab:

  • Kreativindustrie (Audio/Video): Ein historisches Paradebeispiel ist die Musik-Software Cubase von Steinberg. Die Software ist strikt Closed Source, etablierte aber die VST-Schnittstelle (Virtual Studio Technology). Steinberg kennt die Mathematik fremder Audio-Filter nicht, und die Filter-Entwickler kennen Steinbergs Audio-Engine nicht. Sie tauschen ĂŒber Opaque Pointers lediglich Audio-Puffer aus. So entstand ein Milliardenmarkt fĂŒr Drittanbieter-Plugins.

  • Automotive & Simulation: In der Fahrzeugentwicklung nutzen Hersteller und Zulieferer den FMI-Standard (Functional Mock-up Interface). Wenn ein Autokonzern eine Fahrzeug-Simulation in einem geschlossenen Host-System (wie MATLAB/Simulink) baut, ĂŒbergibt ein Getriebehersteller sein mathematisches Modell lediglich als vorkompilierte BinĂ€rdatei (FMU). Die Host-Simulation fĂŒttert das Plugin via C-ABI mit Drehzahl und Temperatur und erhĂ€lt physikalische Ergebnisse zurĂŒck. Die streng geheimen Reibungs-Algorithmen des Zulieferers bleiben unangetastet.

  • Finanzwesen: Institutionelle Trading-Plattformen wie MetaTrader erlauben es, Analyse-Werkzeuge und Trading-Strategien als native .dll-Dateien einzubinden. Zu beachten ist dabei, dass MetaTrader primĂ€r eine eigene Skriptsprache (MQL4/5) anbietet; native DLLs sind eine ergĂ€nzende Erweiterungsoption fĂŒr rechenintensive oder besonders schĂŒtzenswerte Logik. Die Plattform leitet Börsendaten an das Plugin weiter; nach welcher geheimen Strategie der Bot kauft oder verkauft, bleibt das exklusive Firmengeheimnis des Drittanbieters.

Fazit: Das Plugin als wirtschaftliches und juristisches Schutzschild

Egal ob in einer quelloffenen Plattform oder in einer geschlossenen Industrie-Simulation: Ein Drittanbieter kann ein hochkomplexes, proprietÀres Verfahren verkaufen, ohne sein Intellectual Property (IP) jemals im Quelltext offenzulegen.

Ein absoluter Schutz vor Reverse-Engineering ist eine bloße BinĂ€rdatei technisch zwar nicht – Tools wie Decompiler können Maschinencode wieder in Assembler ĂŒbersetzen. Doch wirtschaftlich und juristisch reicht die Barriere meist aus: Das ZurĂŒckgewinnen hochoptimierter Mathematik aus maschinellen Registern ist ein extremer, oft unrentabler Aufwand. Zudem etabliert die BinĂ€rdatei eine klare juristische Grenze (Trade Secret), deren Brechen den Straftatbestand der Industriespionage erfĂŒllt. Wo das nicht reicht, wird die BinĂ€rschnittstelle zusĂ€tzlich mit hardwarebasiertem DRM oder Code-Virtualisierung (Packer) versiegelt.

Die Kosten dieses Architektur-Modells sind hoch: Erhöhter Aufwand bei Debugging, strengste Anforderungen an Versionierung und null Toleranz fĂŒr unsauberes Speichermanagement. Im Gegenzug entsteht jedoch ein extrem belastbares Ökosystem, in dem Implementierungskapital (der geheime Algorithmus) und Distribution (die Host-Plattform) völlig unabhĂ€ngig voneinander skalieren und monetarisiert werden können.

Teil 4: Vereinfachende Standards – Alternativen zur rohen C-ABI

Frage: Gibt es vereinfachende Standards, die denselben IP-Schutz bieten wie die in Teil 3 beschriebene C-ABI, aber mit weniger FehleranfÀlligkeit?

Die rohe C-ABI ist mĂ€chtig, aber gefĂ€hrlich: Ein falsch verwalteter Pointer, ein Versionskonflikt beim Compiler oder eine unterschiedliche Calling Convention genĂŒgen, um das gesamte System zum Absturz zu bringen. Die Industrie hat auf diesen Schmerz reagiert und mehrere Abstraktionsschichten entwickelt, die denselben IP-Schutz bieten – mit deutlich sanfteren Kosten.

WebAssembly (WASM) + WASI

Das ist der aktuell stĂ€rkste Trend fĂŒr neue Systeme. Das Plugin wird zu .wasm kompiliert und lĂ€uft in einer sandboxed virtuellen Maschine – vollstĂ€ndig plattformunabhĂ€ngig, ohne geteilten Adressraum, ohne Speicherverwaltungsprobleme zwischen Host und Plugin. Der Host kontrolliert exakt, welche Ressourcen das Plugin sehen darf (Filesystem, Netzwerk, Systemaufrufe). Frameworks wie Extism bauen darauf auf und liefern ein generisches Plugin-System, das in nahezu jeder Host-Sprache funktioniert. IP-Schutz: WASM-Bytecode ist deutlich schwerer zu reverse-engineeren als natives x86, kein absoluter Schutz, aber eine höhere HĂŒrde als eine nackte .so. Der Preis ist Laufzeit-Overhead durch die VM – fĂŒr Echtzeit-Audio oder physikalische Simulation heute noch zu teuer, fĂŒr alles andere zunehmend akzeptabel.

COM / DCOM (Windows-Welt)

Microsofts Component Object Model löst seit den 1990ern exakt dieses Problem: typsichere, versionierte BinĂ€rschnittstellen ohne Quellcode, mit definiertem Ownership-Modell (AddRef/Release) und maschinenlesbaren Interface-Beschreibungen (IDL/TLB). VST3 von Steinberg – der direkte Nachfolger der in Teil 3 beschriebenen VST-Schnittstelle – baut auf COM-Ă€hnlichen Prinzipien auf und ist damit ein direktes Beispiel fĂŒr die Ablösung der rohen C-ABI durch einen formalisierteren Standard im selben Ökosystem. Der Preis: primĂ€r Windows-zentriert, und das Objektmodell trĂ€gt historischen Ballast.

gRPC / Protobuf ĂŒber lokalen Socket

Kein ABI-Ansatz im klassischen Sinne, aber in der Praxis weit verbreitet: Das Plugin lĂ€uft als eigenstĂ€ndiger Prozess, die Kommunikation erfolgt ĂŒber ein maschinenlesbares Schema (.proto-Datei). VollstĂ€ndige SprachunabhĂ€ngigkeit, triviales Versionieren ĂŒber Feldnummern, automatisch generierte Clients und Server in Dutzenden Sprachen. IP-Schutz ist maximal – der Plugin-Prozess ist eine vollstĂ€ndige Blackbox. FĂŒr die Finanzwelt (MetaTrader-Szenario aus Teil 3) ist das ein realistischer Ansatz: Latenz im Sub-Millisekunden-Bereich ist dort weniger kritisch als bei Echtzeit-Audio. FĂŒr FMI-Simulation oder VST-Audio scheidet dieser Ansatz jedoch aufgrund der Prozess-Kommunikationskosten aus.

Bewertungsmatrix

Standard Plattform Latenz Versionierung RE-Schutz KomplexitÀt
Rohe C-ABI Überall Minimal Manuell, fehleranfĂ€llig Mittel Hoch
WASM + WASI Überall Gering Gut Hoch Mittel
COM / VST3 Windows-nah Minimal Formalisiert Mittel Mittel
gRPC / Protobuf Überall Moderat Sehr gut Sehr hoch Niedrig

Der Trend geht fĂŒr neue Systeme klar Richtung WASM. FĂŒr latenz-kritische Industrieanwendungen – FMI-Simulation, VST-Audio, Automotive-Echtzeit – bleibt die C-ABI jedoch noch auf absehbare Zeit der Goldstandard. Kein vereinfachender Standard ĂŒberwindet die grundlegende Physik: Wer nanosekunden-genaue Übergabe von Audiodaten oder Differentialgleichungen braucht, zahlt den Preis der rohen Schnittstelle.

17. April 2026

Viewports, Masken und stabile 60 FPS

Heute gibt es ein kurzes technisches Update zum aktuellen Stand unseres maßgeschneiderten UI-Toolkits.

Aktueller Stand der UI mit Viewports und MaskenAbb 1: Die aktuelle Testumgebung im nkrunner mit Fokus auf Fensterverwaltung und Rendering.

Der Entwicklungsschwerpunkt lag in den letzten Tagen auf der Fensterverwaltung und dem Rendering-System. Echte, belastbare BenutzeroberflĂ€chen bestehen selten nur aus flachen Elementen – sie benötigen tief verschachtelbare (nestable) Strukturen.

DafĂŒr haben wir in unserem UI-Toolkit nun ein sauberes System fĂŒr Masken und Viewports implementiert. Scrollbare Bereiche funktionieren jetzt zuverlĂ€ssig: Sobald ein Child-Element den zugewiesenen Bereich seines Parent-Containers verlĂ€sst, wird es visuell und logisch korrekt abgeschnitten (Clipping).

Gleichzeitig lag ein extremer Fokus auf der Performance bei dynamischen FenstergrĂ¶ĂŸen. Egal wie komplex die Hierarchie der scrollbaren Viewports wird, das Rendering im nkrunner muss absolut flĂŒssig bleiben. Die strikte Vorgabe lautet: Stabile 60 FPS. Das ist keine kosmetische Metrik, sondern elementar wichtig. Sobald ein Werkzeug ruckelt oder bei GrĂ¶ĂŸenĂ€nderungen des Fensters Framedrops zeigt, geht das GefĂŒhl der direkten Kontrolle verloren.

Der nÀchste Schritt: Der Datenhub

Das Fundament fĂŒr das visuelle Layout und das rĂ€umliche Eingrenzen (Maskierung) steht und lĂ€uft performant. Im nĂ€chsten Schritt geht es darum, die Elemente des UI-Toolkits mit echtem Leben zu fĂŒllen. Wir werden diese internen ZustĂ€nde in einem zentralen Datenhub synchronisieren, um grafisches Rendering, Nutzereingaben und die tieferliegende GeschĂ€ftslogik sauber (und nebenlĂ€ufig) miteinander zu verknĂŒpfen.

16. April 2026

Performance-Sprung, Lasso-Selektion und Code-Hygiene

Nach den Architekturanpassungen der letzten Wochen – insbesondere der Umstellung auf Parallelverarbeitung – ging es in den vergangenen Tagen an die spĂŒrbare Praxis: Interaktion und Performance unter echter Last.

Aktueller Stand der UI mit tausenden Objekten und Lasso-SelektionAbb 1: Die Spatial UI beim Selektieren und Verschieben von massiven Objektmengen.

Tausende Objekte: Dragging und Lasso-Selektion

Es ist eine Sache, 2000+ Objekte stabil auf den Bildschirm zu zeichnen (wie in Version 0.11 getestet). Eine völlig andere ist es, sie flĂŒssig bedienbar zu machen. Der Fokus lag in diesem Schritt auf der direkten Manipulation im Spatial Workspace.

Das Einfangen von Objekten per Lasso-Selektion und das anschließende Dragging (Verschieben) der gesamten Auswahl durch die Szenerie funktioniert nun absolut reibungslos. Selbst bei tausenden gleichzeitig bewegten Elementen bricht die Framerate nicht ein. Die strikte Trennung von visueller Darstellung und auswertbarer Geometrie (Picking-Logik) greift hier perfekt ineinander.

Skalierbare Texterfassung

Wer schon einmal eine UI-Engine gebaut hat, weiß: Text ist teuer. Deshalb haben wir die Skalierbarkeit bei der Texterfassung und dem Text-Rendering gezielt optimiert. Eingaben, UmbrĂŒche und das Rendering vieler dynamischer Text-Nodes innerhalb der Virtual Windows verbrauchen nun spĂŒrbar weniger Ressourcen. Das gibt dem System den nötigen Spielraum, um auch komplexe Layouts performant zu halten.

AufrÀumarbeiten und Modularisierung

Schneller Code entsteht selten im Chaos. Um diese Performance-SprĂŒnge zu erreichen – und vor allem fĂŒr die Zukunft wartbar zu halten –, standen massive AufrĂ€umarbeiten an.

Getreu dem Motto "Orthogonal arbeiten" haben wir die Quellcodes besser aufgeteilt und die Engine stĂ€rker modularisiert. ZustĂ€ndigkeiten sind nun noch schĂ€rfer voneinander getrennt. Das macht das System nicht nur effizienter in der AusfĂŒhrung, sondern auch deutlich angenehmer in der Weiterentwicklung. Das Fundament trĂ€gt.

15. April 2026

Orthogonal arbeiten: Wer alles anfasst, macht alles kaputt

In der Theorie klingt OrthogonalitĂ€t simpel: Zwei Dinge sind orthogonal, wenn Änderungen am einen das andere nicht beeinflussen. In der Praxis der Softwareentwicklung ist das oft das erste Prinzip, das fĂŒr "schnelle Ergebnisse" geopfert wird. Das Ergebnis ist dann kein Werkzeug, sondern ein KnĂ€uel aus AbhĂ€ngigkeiten.

Die Illusion der AbkĂŒrzung

HĂ€ufig wird Code so geschrieben, dass er "praktisch" ist – ein globaler Zustand hier, eine kleine Querbeziehung da. Man spart sich im Moment drei Zeilen Code oder eine saubere Schnittstelle. Aber sobald man an Komponente A schraubt, fliegt einem Komponente B um die Ohren, die eigentlich gar nichts damit zu tun haben sollte. Das ist das Gegenteil von orthogonalem Arbeiten.

Wer orthogonal arbeitet, akzeptiert den initialen Mehraufwand fĂŒr klare Trennungen. Das Ziel ist, dass ein Feature oder ein Bugfix eine lokale Angelegenheit bleibt.

Beispiele aus der Praxis

Ein gutes System zeigt diese Trennung in seiner Architektur:

  1. Rendering vs. Picking: Wie in meiner aktuellen Engine umgesetzt, sollte das Sichtbare vom Auswertbaren getrennt sein. Ein eigener Picking-Pass sorgt dafĂŒr, dass die grafische Finesse keine Auswirkung auf die Treffsicherheit der Maus hat.
  2. Shader-Logik: Statt fĂŒr jedes Backend manuell zu frickeln, nutzt man einen zentralen Pfad und moderne Shader-Compiler. Die Host-Seite bleibt von der GPU-Logik (GLSL) komplett getrennt.
  3. Zustand und UI: Hintergrundarbeit gehört in eigene Threads, damit die UI nicht stottert. Sobald sich die Berechnung in den UI-Takt frisst, ist die OrthogonalitÀt verloren.

Warum das wichtig ist

Wenn man nicht orthogonal arbeitet, steigt die kognitive Last exponentiell an. Man kann sich nicht mehr auf eine Sache konzentrieren, sondern muss das gesamte System im Kopf behalten, um keine Lawine an Fehlern auszulösen.

OrthogonalitĂ€t bedeutet Respekt vor der eigenen Zeit und der Zeit derer, die den Code spĂ€ter lesen mĂŒssen. Es geht darum, Verantwortung fĂŒr die Folgen einer Änderung zu ĂŒbernehmen. Wer behauptet, "schnell fertig" zu sein, indem er alles mit allem verheiratet, lĂŒgt sich selbst in die Tasche. Echte Effizienz entsteht durch UnabhĂ€ngigkeit.

13. April 2026

Version 0.11 – Parallelisierung & iGPU-Limitierung

Das heutige Update auf Version 0.11 bringt tiefgreifende Änderungen an der Engine-Architektur. WĂ€hrend die visuelle Seite der Spatial UI weiter wĂ€chst, stand diesmal die Performance-Analyse unter erschwerten Bedingungen im Vordergrund.

Hauptansicht der Engine v0.11 mit erweiterten Render-ObjektenAbb 1: Die Engine bei ĂŒber 2000 aktiven Render-Objekten.

Das Test-System: 100 % On-Chip

Um die Leistungswerte realistisch einzuschĂ€tzen, hier die Hardware-Konfiguration. Wichtigster Punkt: Es ist keine dedizierte Grafikkarte verbaut. Das System verfĂŒgt ĂŒber keinen PCIe-Grafikbeschleuniger; die gesamte Bildausgabe und Berechnung erfolgt ĂŒber die integrierte Einheit des Prozes1rs.

  • CPU: AMD Ryzen 7 5700G (8 Kerne, 16 Threads, Zen 3 Architektur)
  • Integrierte GPU: AMD Radeonℱ Graphics (Vega 8)
    • Grafikkerne: 8
    • Taktfrequenz: 2000 MHz
    • Speicher: Shared Memory (nutzt einen Teil des System-RAMs)
  • RAM: 32 GB Corsair Vengeance LPX DDR4-3200
  • Mainboard: ASUS ROG Strix B550-F Gaming

Aktuell liegen wir bei >20 FPS bei >2000 aktiven Render-Objekten. Dass wir diese StabilitĂ€t rein ĂŒber die iGPU erreichen, ohne dass eine physische Grafikkarte im Slot steckt, ist ein ehrliches und brauchbares Ergebnis fĂŒr den aktuellen Optimierungsstand.

Umstellung auf Parallelverarbeitung

Der wichtigste technische Schritt in Version 0.11 war die Umstellung auf Parallelverarbeitung. Wir nutzen nun das Threading-Modell, um die Vorbereitung der Render-Daten und die Objekt-Logik massiv zu parallelisieren.

Dadurch verhindern wir, dass die CPU zum Engpass wird. Die 2000+ Objekte werden effizient verwaltet, sodass der Flaschenhals nun fast ausschließlich bei der FĂŒllrate und den Draw-Calls der integrierten Radeon-Einheit liegt.

Detailansicht des UI-Editors und der Parallel-Tests*Abb 2: Auch bei hoher Last auf der integrierten Grafik

10. April 2026

We don't break user space

Linus Torvalds wird ein Satz zugeschrieben, der trockener kaum klingen könnte und gerade deshalb so gut ist: „We don't break user space.“ Kein Zukunftsgeflimmer, kein Produktsprech, kein Gerede von Disruption, sondern bloß eine knappe Regel mit erstaunlich viel Anstand. Gemeint ist im Kern, dass interne Änderungen nicht einfach dazu fĂŒhren dĂŒrfen, dass draußen funktionierende Programme, Skripte und ArbeitsablĂ€ufe plötzlich kaputtgehen.

Das klingt zunĂ€chst nach einer rein technischen Maxime aus der Linux-Welt, ist aber eigentlich sehr viel allgemeiner. „User space“ meint dort die Welt, in der Menschen tatsĂ€chlich arbeiten: Tools, Shells, Editoren, Dienste, Routinen, gewachsene Systeme. Und genau diese Welt ist es, die in vielen Projekten erstaunlich wenig Respekt erfĂ€hrt, sobald irgendwo jemand beschließt, nun werde „endlich mal aufgerĂ€umt“.

Der Reiz dieses Satzes liegt darin, dass er eine unangenehme Wahrheit ausspricht: Sobald Leute sich auf ein Verhalten verlassen, ist dieses Verhalten real. Es spielt dann nur noch begrenzt eine Rolle, ob eine Schnittstelle intern schön ist, ob ein Flag historisch gewachsen oder ein Dateiformat nicht mehr elegant wirkt. Irgendwo hĂ€ngt fast immer ein Skript daran, ein Build, ein Server oder schlicht ein Mensch, der sich einen Ablauf ĂŒber Jahre eingeprĂ€gt hat. Von innen sieht das schnell wie Altlast aus; von außen ist es oft einfach etwas, das zuverlĂ€ssig funktioniert.

Genau hier beginnt der Unterschied zwischen technischer Eitelkeit und technischer Reife. Es ist leicht, Dinge neu und sauber zu entwerfen, wenn man so tut, als gĂ€be es keine Vergangenheit. Schwierig ist es, ein System zu verbessern, ohne dabei die Kosten der eigenen Verbesserung nach außen abzuwĂ€lzen. Vieles, was als Modernisierung verkauft wird, ist in Wahrheit bloß eine Verlagerung von Aufwand: Innen wurde etwas hĂŒbscher, außen brechen Dokumentation, Gewohnheiten und Automatismen.

Darum ist KompatibilitĂ€t auch keine feige Tugend und kein Ausdruck von Ideenarmut. Sie ist Respekt vor fremder Zeit. Wer funktionierende Nutzung erhĂ€lt, schĂŒtzt nicht nur Code, sondern investierte Lebenszeit, eingeĂŒbte Handgriffe und oft genug ganze ProduktionsablĂ€ufe. Das ist unerquicklich, weil es MĂŒhe macht. Man muss ÜbergĂ€nge bauen, unschöne SonderfĂ€lle mitschleppen, Ersatzpfade anbieten und manchmal den eigenen Wunsch nach totaler Bereinigung zurĂŒckstellen. Aber genau darin liegt oft die eigentliche Ingenieursleistung.

NatĂŒrlich heißt das nicht, dass niemals etwas verschwinden darf. Jedes System braucht irgendwann Schnitte, sonst erstickt es an seiner eigenen Geschichte. Nur ist eben nicht jeder Bruch schon deshalb legitim, weil die neue Lösung dem Entwickler besser gefĂ€llt. Wenn man etwas Ă€ndern muss, dann möglichst mit BegrĂŒndung, Vorlauf und einem brauchbaren Weg von alt nach neu. Nicht jeder Bruch ist vermeidbar, aber die GleichgĂŒltigkeit gegenĂŒber seinen Folgen wĂ€re es oft schon.

Vielleicht gefĂ€llt mir dieser Satz deshalb so gut, weil er so wenig Theater macht. Er behauptet nicht, die Welt neu zu erfinden, sondern erinnert an etwas viel BodenstĂ€ndigeres: Wenn andere Menschen auf einem System aufbauen, entsteht Verantwortung. Das ist keine spektakulĂ€re Einsicht, aber eine, von der ein erstaunlich großer Teil der Softwarewelt profitieren wĂŒrde.

9. April 2026

3D Spatial UI und Text-Editor

Heute möchte ich euch einen Blick auf den aktuellen Stand des Interfaces werfen lassen. Wir haben nun eine funktionierende, rÀumliche BenutzeroberflÀche (Spatial UI), die komplett in unserem Stack gerendert wird.

Hier ist ein aktueller Screenshot aus der Engine:

Vorschau der 3D Spatial UI mit schwebenden Text-Panels und KoordinatensystemAbb 1: Unsere rÀumliche BenutzeroberflÀche mit aktiven Text-Modulen, Selektions-Pfeilen und globalem Koordinatensystem.

Was gibt es Neues zu sehen?

Wie man auf dem Screenshot gut erkennen kann, verschmelzen 2D-UI-Konzepte immer mehr mit der 3D-Welt. Die wichtigsten Neuerungen auf einen Blick:

  1. Virtual Windows: Wir haben mehrere schwebende Panels im Raum platziert ("Mitarbeiter Profil", "Projekt Übersicht", "Aufgabenliste"). Diese Panels sind keine statischen Texturen, sondern echte 3D-Objekte, die im Raum frei bewegt und skaliert werden können.
  2. Der integrierte Texteditor: Das gelb umrandete Panel rechts ("Textobjekt Test") zeigt unseren neuen Texteditor in Aktion. Wie im Textfeld beschrieben:
    • Mit F2 startet man den Edit-Mode direkt im 3D-Raum.
    • Strg+W schaltet den Wordwrap um.
    • Strg+P öffnet zusĂ€tzlich unser HUD-Eingabefeld.
  3. Selektion & Snapping: Die gelben und grĂŒnen Pfeile, die vom Zentrum ausgehen, visualisieren unser neues Navigations- und Snapping-System. Objekte "wissen", wo sie sich relativ zueinander befinden. Ein Constraint-System sorgt dafĂŒr, dass Fenster logisch aneinander andocken können, ohne sich unschön zu ĂŒberlappen.
  4. Das globale Koordinatensystem: Die X-, Y- und Z-Achsen helfen bei der Orientierung, wÀhrend die Kamera (mit Maus und Numpad steuerbar) stufenlos heranzoomen oder um die Panels kreisen kann.

Wie geht es weiter?

Das Fundament steht! Das Rendering ĂŒber den Render-Pass funktioniert performant. Wie bereits im Editor-Testfenster auf dem Screenshot angeteasert, lauten die nĂ€chsten Ziele:

  • Verfeinerung der Mauslogik (besseres Drag & Drop Verhalten).
  • "Echte" Inner-Frame-Inputs fĂŒr die Virtual Windows (z.B. Buttons klicken oder Text markieren).
  • Erweiterung der Undo/Redo-Historie fĂŒr komplexe Layout-Änderungen.

Bleibt dran, wir nĂ€hern uns mit großen Schritten einem voll funktionsfĂ€higen Spatial-Workspace!

8. April 2026

Architektur einer UI-Engine: Interaktion und Zustand

Bei interaktiver Software liegt die eigentliche Arbeit nicht bei Farben, AbstĂ€nden oder Widget-Namen. Die harten Probleme beginnen dort, wo ein System gleichzeitig Geometrie zeichnen, Eingaben auswerten, ZustĂ€nde halten und Änderungen wieder zurĂŒcknehmen muss. Genau dort trennt sich eine bloße OberflĂ€che von einem echten Werkzeug.

In meinem aktuellen Engine-Projekt arbeite ich genau in diesem Bereich. Der Kern liegt nicht in einem Satz fertiger Controls, sondern in den technischen Schichten darunter: Objektmodell, Eingabeverarbeitung, zielgenaues Anvisieren (Picking) und NebenlÀufigkeit.

PrÀzises Picking statt reiner Optik

Sichtbare Geometrie und auswertbare Geometrie sind zwei verschiedene Probleme. Ein Element kann optisch korrekt sein und trotzdem fĂŒr den Nutzer schlecht treffbar. Deshalb nutzt das Projekt eine strikt vom visuellen Rendering getrennte Logik. Die Bedienung hĂ€ngt daran, dass Dinge pixelgenau und zuverlĂ€ssig adressierbar bleiben, unbeeinflusst von komplexen visuellen Effekten, Transparenzen oder Überdeckungen.

Zentrale Shader-Architektur & Pipeline

Die grafische Darstellung wird ĂŒber eine zentrale Architektur gesteuert. Aus einer zentralen Beschreibung werden die passenden Artefakte generiert. Primitive, Tiefentests und Layouts werden pro Pfad explizit gesetzt. Das ist zwingend, denn transparente Überlagerungen, Texte und 3D-Körper haben völlig unterschiedliche Anforderungen an die Grafikkarte.

NebenlÀufigkeit ohne Ruckeln

Die wichtigste Regel fĂŒr flĂŒssige Werkzeuge: Hintergrundarbeit darf den UI-Takt niemals blockieren. Sobald Berechnungen neben den Eingaben laufen, muss der Haupt-Thread frei bleiben. Die Architektur nutzt getrennte Worker-Prozesse, damit die OberflĂ€che mit konstanten Framerates reagiert, völlig unabhĂ€ngig davon, wie viel Last das System im Hintergrund verarbeitet.

Der Wert dieses Projekts liegt nicht in einer Sammlung von Einzel-Features, sondern im architektonischen Fundament. Wer diese Probleme in eine gemeinsame, stabile Struktur zwingt, baut ein belastbares Werkzeug.