Dfpsr
Eine moderne Software -Rendering -Bibliothek für C ++ 14 mit SSE/Neon, die von David Forsgren Piuva erstellt wurde. Wenn Sie nach der neuesten Mainstream -Modeerscheinung suchen, schauen Sie sich woanders hin. Dies ist eine Bibliothek für hochwertige Software, die über mehrere Jahrzehnte entwickelt werden soll und Ihre Enkelkinder mit minimaler Wartung überlebt. Genau wie das Einschneiden Ihres Erbes in Stein, erfordert es mehr Anstrengung, um die Fähigkeiten zu beherrschen, liefert aber ein robusteres Ergebnis, indem sie sich nicht auf eine weit entfernte Bibliothek verlassen. Maximale Benutzererfahrung und minimale Systemabhängigkeit.
Hintergrund des Schöpfers
Dxomark -Weltrekord bei der digitalen Videostabilisierung aus der Mobilbranche. Arbeitete mit Sicherheitskritikern für die Verkehrskontrolle der zivilen Flughafen. Hielt Vorträge zur Optimierung in verschiedenen Unternehmen in der mobilen, medizinischen und gamingischen Branche. Arbeitete mit Optimierungen an GPU, CPU, DSP, ISP, FPGA und ASIC.
Optimierung benötigt gute Tools, um Ihre Zeit zu sparen
Der wichtigste Teil bei der Optimierung des Codes besteht darin, sowohl Hochalgorithmen als auch Einschränkungen bei niedrigen Hardware zu erfassen, da Sie nicht zulassen, dass ein Wissenschaftler den Algorithmus entwerfen und ein Programmierer ihn ohne Raum für Änderungen im handgeschriebenen Assembler (der häufigste Fehler) optimieren. Das Algorithmus -Design erfolgt erst dann, wenn Sie einen guten Kompromiss zwischen Qualität und Leistung mit allen vorhandenen Optimierungen haben. Zeiteinsparungen auf Kosten der Qualität an einem Ort können durch Steigerung der Qualität zu geringeren Kosten an einem anderen Ort ausgeglichen werden, um sowohl Geschwindigkeit als auch Qualität zu erhöhen. Je schneller Sie eine nahezu optimale Vektorisierung eines Algorithmus erstellen können, desto schneller können Sie den Entwurfsprozess itererieren. Überlegen Sie, was Sie wirklich nähern. Ist Ihr Ziel, so viele perfekt gerade Polygone wie möglich zu zeichnen, oder ist das Ziel, eine komplexe reale Form mit einer Technik zu nähern?
Die offizielle Website: Dawoodoz.com
Wie Ihre Spiele aussehen könnten, können Sie die isometrische CPU -Rendering verwenden

Dynamisches Echtzeit-Licht mit gegossenen Schatten auf Tiefenbasis und normaler Mapping bei 453 Bildern pro Sekunde in 800 x 600 Pixeln, die auf der CPU laufen. Höhere Auflösungen würden den Retro -Stil brechen und tatsächlich schlechter aussehen, aber es gibt noch viel Zeit für Spiellogik und zusätzliche Effekte. Durch die Vorrendern von 3D-Modellen zu diffusen, normalen und Höhenbildern ist das Lesen der Daten viel effizienter für moderne CPUs als eine freie Perspektive. Dies ermöglicht auch mehr Dreiecke als Pixel auf dem Bildschirm und passive Updates der statischen Geometrie. 3D-Modelle mit niedrig detaillierter Details werden verwendet, um dynamische Schatten zu gießen.
Traditionelles 3D -Rendering mit Polygonen wird ebenfalls unterstützt

Das 3D-Rendering ist nicht so schnell wie das 2D- oder isometrische Rendering der CPU, sondern erreicht häufig 60 Hz in 1920 x 1080 Pixel für niedrig detaillierte Grafiken. Für ein höheres Detailniveau und mehr Funktionen wird empfohlen, die Rendering -Pipeline zu kopieren und zu ändern, um sie nur für die gewünschten Funktionen zu kopieren, und dann die Mathematik für Ihre spezifische Rendering -Engine zu vereinfachen, wie für das Beispiel für das Sandbox -Beispiel, bei dem nur Scheitelpunktfarben für winzige Dreiecke ohne Perspektive benötigt werden, sodass Farben durch Inkrementierung von Color -Werten anstelle von Interpolierungen von Tiefen berechnet werden können.
Warum einen Open-Source-Software-Renderer verwenden, wenn GPUs so schnell sind?
- Robustheit mit einem Software-Renderer wird Ihr System wahrscheinlich nicht ruinieren, wenn Sie einen Fehler machen, im Gegensatz zu Grafik-APIs für die GPU, die anfällig für Blue-Screens sind.
- Determinismus Wenn er auf einem Computer funktioniert hat, funktioniert er wahrscheinlich auf einem anderen Computer mit geringfügigen Unterschieden zwischen Betriebssystemen. OpenGL hat jedoch keine Funktionen, die noch nicht entfernen, wenn Sie alles entfernen, was einen Fehler in einer Treiberimplementierung enthält.
- Niedriger Overhead Wenn Sie eine geringe Auflösung für den visuellen Stil oder den Robotervision wünschen, können Sie es mit einem statisch verknüpften Software -Renderer auch minimal halten, wenn die GPU langsamer wäre.
- Einfaches Debuggen Wenn alle Daten in einem Software -Renderer verarbeitet werden, ist es viel einfacher zu sehen, was beim Debuggen schief gelaufen ist.
- Einfach zu ändern Es gibt keine Hardware -Grenzen als CPU -Zyklen und Speicher, sodass Sie die gesamte Rendering -Pipeline durch Kopieren und Einfügen von Code ändern können.
- Pixel exact 2D, anstatt seltsame Problemumgehungen über Polygonen herzustellen, können Sie mit einem Software -Renderer zunächst mit ganzen Pixeln arbeiten.
Warum diesen Software -Renderer verwenden?
- Minimale Systemabhängigkeiten Alles, was auf eine bestimmte System -API zu tun hat, wird in ein separates Wrapper -Modul platziert, das das minimale Minimum der wesentlichen Funktionen integriert, die leicht in zukünftige Betriebssysteme integriert werden sollten. Im Gegensatz zu anderen Software-Renderern benötigen diese keine Grafiktreiber, da Sie mithilfe von Multi-Threading die gleiche Leistung erhalten können, indem Sie die Leinwand auf einem Hintergrund-Thread hochladen, wenn die meisten Kerne ohnehin im Leerlauf sind.
- Keine Binärdateien Die gesamte Bibliothek wird automatisch aus dem Quellcode zusammengestellt. Sogar das Build -System setzt sich vor dem Bau Ihres Projekts zusammen. Dies stellt sicher, dass niemand in der Zukunft das Jahrhundert -alte Ingenieurbinärdateien umkehren muss, wenn Sie versuchen, Ihr Programm aufzubauen, und es ist auch viel sicherer gegen Malware, wenn alles in lesbarem Code inspiziert werden kann.
- Die statische Verknüpfung der gesamten Bibliothek ist statisch mit Ihrem Programm verknüpft, als hätten Sie den Code selbst geschrieben. Es werden nur Kern -System -APIs, auf die seit Jahrzehnten überlebt wird, als Abhängigkeiten, keine GPU -Treiber, keine externen Medienschichten. Alles von der Codierung von Unicode -Zeichen und Rendern von Schriftarten bis hin zu einer Rasterpuffer, die ein Polygon gegen einen Tiefenpuffer rasterisiert wird, wird in Ihrem kompilierten C ++ -Programm für maximale Zuverlässigkeit und Determinismus existieren. Das Build -System ermöglicht die staatliche Verknüpfung der C ++ - Standardbibliotheken, wenn möglich.
- Erstellen Sie Ihr Vermächtnis Machen Sie Software, die zukünftige Generationen möglicherweise portieren, kompilieren und nativ erstellen und ausführen können, ohne dass Emulatoren oder Reverse Engineering von proprietären Grafiktreibern erforderlich sind.
Funktionen in dieser Bibliothek
- Vollautomatische C ++ -Abbuildungssystem Keine langen Listen von Quelldateien in Ihrem Projekt. Das mitgelieferte Build -System findet die enthaltenen Header und deren namentlich entsprechende Quelldateien automatisch. Sagen Sie es einfach, er solle vom Main kriechen und den Rest automatisch herausfinden. Verschiedene Backends für Bibliotheken werden durch Einbeziehung der Projektheader der Bibliothek gehandhabt, die mitteilt, welches Backend für jede Plattform verwendet werden soll. Überprüfungen werden verwendet, um nur das zu erstellen, was sich geändert hat. Daher müssen keine statische Bibliothek für Teile Ihres Codes erstellt werden.
- 2D -Zeichnung Pixel Exact Standard Draw fordert Linien, Rechtecke, feste Bildkopie, alpha -gefilterte Bildzeichnung, gepufferte Tiefenzeichnung und Schablonenzeichnung.
- 3D-Rendering in etwa gleichwertig mit Direct3D 7 mit bi-linearer Texturabtastung, MIPMapping, Lightmaps und Alpha-Filterung, wenn Sie nicht aus dem Feld verwendet werden, kann jedoch so geändert werden, dass sie mehr wie Direkt 3D 9 sind, wenn Sie Schattierungen auf Texturen anwenden (können mit SIMD mit Multi-Threading geplant und auf der Basis von Entfernungen geplant werden).
- Okklusionssystem Die Sammlung von Rendering-Aufgaben für Multi-Threading enthält auch ein Okklusionsraster, in dem Okklusionsformen gezogen werden können, um das Zeichnen von Dreiecken, Objekten oder Ganzgruppen zu überspringen, wenn Ihre Motor eine Breitphasen für Keulungs- und Okklusionstests implementiert. Diese voll dynamische Okklusion kann dann mit statischen Optimierungen für bestimmte Spiele kombiniert werden, indem Informationen darüber verwendet werden, welche Regionen von jedem Kamera -Standort aus angezeigt werden können.
- Optionales FAR-Ausschnitt Da diese Grafik-API nur Floating-Punkt-Tiefenpuffer für die Perspektive verwendet. Es müssen nicht die Tiefenwerte für jede ganzzahlige Darstellung normalisiert werden. Auf diese Weise können Sie beim Erstellen Ihrer Kamera einen unendlichen Abstand aus der Ferne auswählen, wenn Sie es sich leisten können, die gesamte Szene gleichzeitig zu rendern.
- Medienschicht plattformübergreifende Medienschicht für Robustheit. ALSA- und WinMM -Sound -Backends für die volle Kontrolle über Soundmischung, ohne selbst irgendetwas als spezifisches als Spezifikaler bezeichnen zu müssen. Die Fensterverwaltung verwendet Multi-Threading zum Hochladen der Leinwand, sodass Sie keine GPU-Grafiktreiber und schwere Abhängigkeiten benötigen, um das Ergebnis hochzuladen. Verwendet ein randloses Fenster für Vollbildmaterial, damit Sie problemlos auf andere Programme zugreifen können, wenn Sie eine wichtige E-Mail oder eine sofortige Nachricht im Hintergrund erhalten. Auf der CPU erfolgt die Hochschulen, um mit einer Bildschirmauflösung zu arbeiten, ohne sich auf Grafiktreiber zu verlassen, die Pixel möglicherweise die falsche Interpolation verleihen oder nicht einmal existieren. Ältere Medienschichten, die für CTR -Anzeigen ausgelegt sind, können zu Frequenzausfällen außerhalb der Bereichsfehler führen, wenn keine Grafiktreiber installiert sind und die Anzeige die willkürliche Auswahl der Auflösung nicht akzeptiert. Verwendet ein unsichtbares Cursor -Symbol, um die Maus zu verbergen, so dass ein Absturzprogramm den Cursor nicht wegnimmt, wenn versucht wird, den Prozess abzutöten.
- Grafische Benutzeroberfläche Framework laden Sie eine visuelle Schnittstelle in Ihr Fenster mit einer einzigen Codezeile, die eine Layoutdatei oder eine String liest. Erhalten Sie generische Griffe an Komponenten mit Namen oder einer Kombination aus Namen und Index. Fügen Sie Ereignisse hinzu, indem Sie Lambda -Funktionen an Komponenten- und Fenster -Rückrufe anfügen.
- Timer erhalten die doppelten Präzisionssekunden seit dem ersten Anruf beim Timer, sodass Sie sich keine Sorgen um Mitternachtsfehler machen müssen, wenn die Tageszeit zurückgesetzt wird.
- SIMD -Abstraktionsschicht Verwenden Sie SIMD.H, um automatisch hocheffiziente SSE-, AVX- und Neon -Intrinsics aus vollständig lesbarer Mathe -Syntax zu generieren. Ihr vektorisierter Code sieht aus wie eine Referenzimplementierung und das Kompilieren für eine unbekannte Zielarchitektur generiert Skalarvorgänge, die weiterhin einen Leistungsschub durch Schreiben Ihres Algorithmus mit grundlegenden Operationen geben können, die am häufigsten direkt in CPU-Hardware unterstützt werden. Zugriff auf den Speicher, der mit Cache-Linien ausgerichtet ist, behalten Sie das Anweisungsfenster mit den Gesprächen mit einem unterschiedlichen Namen.
- Sichere Zeiger verwenden Safepointer.h, um mehr Fehler zu erfassen, indem Sie Ihrem Zeiger mitzuteilen, an welchem Teil einer Zuordnung er funktioniert. Verlassen Sie in der Release -Version keinen Overhead, damit Sie Ihren Rohzeiger durch SafePointer jederzeit ersetzen können und wissen, dass Sie eine informative Fehlermeldung mit dem Namen des Zeigers und detaillierten Informationen erhalten, wenn etwas Schlimmes passiert.
- Saiten verwenden UTF-32, um Zeichen im Speicher zu speichern, um sicherzustellen, dass alle Algorithmen mit Nicht-Latin-Zeichen (kompatibel mit u "" String-Literalen) funktionieren. Speichern in Dateien standardmäßig in UTF-8 (Compact Storage) mit BOM (explizit sagen, welches Format verwendet wird) und Cr LF-Zeilenende (damit Textdateien überall gelesen werden können). Verwendet gemeinsam genutzte Speicherpuffer automatisch, um die Aufteilung in eine Liste von Zeichenfolgen zu ermöglichen, ohne den Haufen mit kleinen Zuordnungen zu überfluten.
- Puffer Alle Dateien werden über Pufferobjekte gespeichert und geladen. Dies stellt sicher, dass alle Dateiformate, die Sie entwerfen, nur Sorgen darüber machen müssen, wie die Bytes codiert werden. Regressionstests sind einfach, indem sie keine externen Nebenwirkungen aus dem Dateisystem einbeziehen, und jede Datei kann mit dem Pufferäquivalent einer Speichernfunktion in Ihre eigene gebündelt werden.
- Dateiverwaltung entspricht ungefähr STD :: Dateisystem aus C ++ 17, funktioniert jedoch mit C ++ 14, verwendet dieselbe Zeichenfolge und readableString-Typen auf allen Plattformen und kann automatisch Ordnerabschlüsse zwischen / (POSIX) und (MS-Windows) korrigieren.
- Das Prozessmanagement kann andere Anwendungen starten und ihren Status verfolgen, damit Sie eine Anwendung wie eine Funktion aufrufen können, die das Ergebnis in Dateien schreibt.
Zusammenfassung der Lizenzen
Diese Bibliothek verwendet hauptsächlich die ZLIB Open Source -Lizenz, enthält jedoch auch die STB -Bildbibliothek zum Speichern und Laden von Bildern, die über eine zulässige Dual -Lizenz (MIT / Unlizenz) verfügen. Da die STB -Image -Bibliothek als öffentlich zugängliche Domäne verwendet werden kann, hat sie keine rechtliche Auswirkungen auf die Verwendung der Bibliothek als Ganzes unter der ZLIB Open Source -Lizenz. Alle enthaltenen Quellcode mit allen Lizenzen ermöglichen sowohl den kommerziellen als auch nicht kommerziellen Einsatz, einschließlich einer nicht genannten Änderung des Quellcode. Wenn Sie den Quellcode nicht umverteilen, müssen Sie niemandem mitteilen, dass Sie diese Bibliothek verwenden, da eine unaufrichtige Bestätigung keinen Wert hat.
Immer noch eine öffentliche Beta
Thema, GUI, Schriftart und Klang -APIs stehen noch in aktiver Entwicklung und haben möglicherweise erhebliche Änderungen, bevor eine stabile Version 1.0 fertig ist, da ein Code nur ein primitiver Platzhalter ist, bis die fortgeschrittene Implementierung sie ersetzen kann, und man muss versuchen, die Bibliothek tatsächlich zu verwenden, bevor Benutzerprobleme offensichtlich werden. Puffer, Datei, Bild, Zeichnen, Filter, Zeichenfolge und Zeit -APIs sind jedoch bereits sehr stabil. Sie können sich für jedes neue Projekt an eine bestimmte Version halten, mit den neuesten Änderungen auf dem Laufenden halten oder auf stabile Version 1.0 warten.
Wie Sie helfen können
- Port zu Macintosh oder Wayland unter Verwendung der gleichen Grundsätze mit minimaler Abhängigkeit.
- Testen Sie diese Beta -Version und geben Sie Feedback zum Design, bevor Version 1.0 veröffentlicht wird.
- Erstellen Sie verschiedene Arten von Spielemotoren mit Open-Source-Tools.
Unterstützte CPU -Hardware:
- Intel/AMD mit SSE2 -Intrinsik und optionalen Erweiterungen.
- Arm mit Neonintrinsik .
- Unbekannte CPU -Architekturen ohne SIMD -Vektorisierung als Fallback -Lösung.
Plattformen:
- Linux , getestet an Minze, Kumpel, Manjaro, Ubuntu, Raspberrypi OS, Raspbian (Buster oder später). Linux Mint benötigt den Compiler- und X11-Header. Führen Sie also "sudo apt installieren g ++" und "sudo APT installieren libx11-dev" vor dem Kompilieren aus. Derzeit ist die Unterstützung von X11 und Wayland für zukünftige Versionen geplant.
- Microsoft Windows , aber langsamer als unter Linux, da Windows viele Hintergrundprozesse und langsameres Threading und Speichermanagement aufweist.
Könnte auch arbeiten:
- BSD und Solaris haben Code, die auf die Plattformen in fileapi.cpp abzielen, um den Anwendungsordner zu erhalten, aber es fehlen wahrscheinlich einige Anwendungen für das Ausführen des Build -Skripts. Zukünftige POSIX -konforme Systeme sollten nur wenige Macken haben, um herauszufinden, ob es einen X11 -Server hat.
- Big-Endian wird theoretisch unterstützt, wenn das makro dsr_big_endian weltweit aktiviert wird. Dies wurde jedoch nie aufgrund von Schwierigkeiten mit der Ausrichtung eines so alten Systems mit modernen Compilern getestet.
Noch nicht portiert auf:
- Macintosh verwendet X11 nicht mehr, daher erfordert es einige Portierungsanstrengungen. Macintosh hat keine symbolische Verbindung zur Binärdatei des laufenden Prozesses, daher würde es auf das aktuelle Verzeichnis zurückgreifen, wenn er nach dem Anwendungsordner gefragt wird.
Wird nicht abzielen:
- Mobiltelefone. Da die ständigen Änderungen, die auf mobilen Plattformen nach hinten die Kompatibilität von Abwärts brechen, den Zweck der Verwendung eines langjährigen Frameworks besiegen würde. Mobile Plattformen erfordern benutzerdefinierte C ++ -Kompiler, Zugriff auf Signalprozessoren, Bildschirmrotation, Batteriesparen, wissen, wann die virtuelle Tastatur angezeigt werden soll, Sicherheitsberechtigungen, erzwungener Vollbildmodus ... Der Versuch, beides gleichzeitig zu tun, enden mit Designs, die bei beiden Enden wie Microsoft Windows 8 oder Ubuntus-Schussvorgänge zusammenarbeiten.
- Web -Frontenden. Ein solcher Wrapper über diese Bibliothek könnte nicht in der Lage sein, die Kraft von SIMD -Intrinsics für die Definition Ihrer eigenen Bildfilter zu erhalten. Sie wären daher besser, wenn Sie eine GPU -Schattierungssprache aus dem Browser abzielen, die für dynamische Skripts besser geeignet sind.