Müssen Grafik-APIs verwendet werden, um die Hardwarebeschleunigung in einem 3D-Spiel zu erzielen? Inwieweit ist es möglich, von Abhängigkeiten zu Grafikkarten-APIs wie OpenGL, DirectX , CUDA, OpenCL oder was auch immer frei zu sein?
Kann ich meine eigene Grafik-API oder Bibliothek für mein Spiel erstellen? Ist es meiner 3D-Anwendung theoretisch möglich , unabhängig den Grafiktreiber zu kontaktieren und alles auf der GPU zu rendern, auch wenn es schwierig ist ?
Antworten:
Ich denke, dass viele der Antworten einen wichtigen Punkt übersehen: Sie können Apps schreiben, die direkt auf Hardware zugreifen, aber nicht auf modernen Betriebssystemen . Es ist nicht nur ein Zeitproblem, sondern ein Problem "Sie haben keine Wahl".
Windows, Linux, OSX usw. verbieten den direkten Hardwarezugriff auf beliebige Anwendungen. Dies ist aus Sicherheitsgründen wichtig: Sie möchten, dass keine zufällige App beliebigen GPU-Speicher aus dem gleichen Grund lesen kann, wie Sie möchten, dass keine zufällige App Systemspeicher lesen kann. Dinge wie der Framebuffer für Ihr Bankkonto oder was nicht im GPU-Speicher vorhanden ist. Sie möchten, dass das Zeug von Ihrem Betriebssystem isoliert und geschützt und der Zugriff kontrolliert wird.
Nur Treiber können direkt mit der meisten Hardware kommunizieren. Die einzige Möglichkeit, mit dem Treiber zu kommunizieren, besteht in der offengelegten HAL des Betriebssystems und der proprietären und inkompatiblen Schnittstelle jedes Treibers. Diese Treiberschnittstelle ist nicht nur für jeden Hersteller unterschiedlich, sondern auch für jede Version des Treibers selbst. Dadurch ist es nahezu unmöglich, direkt mit der Schnittstelle in einer Consumer-Anwendung zu kommunizieren. Diese Ebenen werden häufig von Zugriffssteuerungen abgedeckt, die den Zugriff für eine Anwendung weiter einschränken.
Nein, Ihr Spiel kann die Hardware nicht einfach direkt verwenden, es sei denn, Sie zielen natürlich nur auf unsichere Betriebssysteme wie DOS ab, und Ihre einzige machbare Option für ein Spiel auf modernen Consumer-Betriebssystemen besteht darin, auf eine öffentliche API wie DirectX, OpenGL oder zuzugreifen Vulkan.
quelle
Praktisch ist es notwendig, ja. Dies ist erforderlich, da Sie eine API verwenden müssen, die sich mit den vorhandenen Treibern der GPU-Hersteller für alle gängigen Betriebssysteme und Hardware vereinheitlicht, sofern Sie nicht Jahre damit verbringen möchten, den wesentlichen Treibercode für die Vielzahl der verschiedenen Hardwarekonfigurationen zu schreiben.
Die einzig realistische Alternative ist, dass Sie keine 3D-Beschleunigung verwenden und stattdessen Software-Rendering verwenden, das auf nahezu jedem System / Gerät ausgeführt werden kann, sofern es in einem wirklich portablen Format wie C geschrieben ist. Das ist in Ordnung für kleinere Spiele ... etwas wie SDL ist für diesen Zweck geeignet ... es gibt auch andere. Es fehlen jedoch die inhärenten 3D-Funktionen, sodass Sie sie selbst erstellen müssen. Dies ist keine triviale Aufgabe.
Denken Sie auch daran, dass das Rendern der CPU ineffizient ist und im Vergleich zu GPUs eine schlechte Leistung aufweist.
quelle
APIs wie OpenGL oder DirectX werden teilweise vom Betriebssystem und teilweise vom Grafiktreiber selbst implementiert.
Das heißt, wenn Sie Ihre eigene Low-Level-API erstellen möchten, die die Funktionen moderner GPUs nutzt, müssen Sie im Wesentlichen einen eigenen Grafiktreiber schreiben. Es wäre eine ziemliche Herausforderung, sicherzustellen, dass Ihr Treiber mit allen gängigen Grafikkarten funktioniert, insbesondere, weil die Anbieter mit ihren Spezifikationen häufig nicht sehr offen sind.
quelle
Starten Sie Ihren PC in MS-DOS. Mit Ihrer Kopie der PC Game Programmers Encyclopedia können Sie dann direkt in die VESA- Register der Karte und in den Videospeicher schreiben . Ich habe immer noch den Code, den ich vor 20 Jahren geschrieben habe, um dies zu tun und rudimentäres 3D in Software zu rendern.
Alternativ können Sie auch DirectX verwenden. Es ist eine wirklich dünne Abstraktionsebene, mit der Sie direkt in Videopuffer schreiben und diese dann auf dem Bildschirm austauschen können.
Es gibt auch den extremen Ansatz , eigene Videohardware zu erstellen .
quelle
Die anderen Antworten beantworten Ihre Hauptfrage ganz gut: Technisch ist es möglich, aber in der Praxis tun Sie genau das Gegenteil, wenn Sie Ihre Kundenbasis erweitern möchten. Während Sie viel Arbeit für die Unterstützung Tausender verschiedener Hardware- und Betriebssystemkonfigurationen aufwenden, die Sie unterstützen müssen.
Dies bedeutet jedoch nicht, dass Sie zu 100% von einer bestimmten API abhängig sein müssen. Sie können jederzeit Ihre eigene Abstraktionsschicht codieren und dann die spezifischeren Implementierungen (z. B. eine DirectX-Implementierung, eine OpenGL-Implementierung usw.) ein- und auslagern.
Auch dann ist es wahrscheinlich nicht wert. Wählen Sie einfach etwas aus, das für Ihre Zwecke gut genug funktioniert, und erledigen Sie es. Sie sind ein Indie-Game-Maker - Sie müssen sich auf die Dinge konzentrieren, die das Spiel ausmachen, nicht auf die Minuten. Mach einfach das Spiel!
quelle
Zusammenfassend: Theoretisch können Sie, aber es ist nicht machbar, und Sie werden keinen Vorteil erhalten. Die Einschränkungen der APIs sind heutzutage von Tag zu Tag geringer geworden. Sie haben CUDA und OpenCL und Shader. Volle Kontrolle zu haben ist also kein Problem mehr.
Vollständigere Erklärung:
Dies zu beantworten ist ein langweiliges Ja . Die eigentliche Frage ist, warum ?
Ich kann mir kaum vorstellen, warum Sie dies anders als zu Lernzwecken tun wollen. Man muss wissen, dass Entwickler irgendwann die Freiheit hatten, alles mit ihren CPU-Rendering-Implementierungen zu machen, jeder hatte eine eigene API, sie hatten die Kontrolle über alles in der "Pipeline". Mit der Einführung von festen Pipelines und GPUs wechselten alle ..
Mit GPUs erzielen Sie eine "bessere" Leistung, verlieren aber viel Freiheit. Grafikentwickler drängen darauf, diese Freiheit zurückzugewinnen. Daher mehr Anpassungs-Pipeline jeden Tag. Mit CUDA / OpenCL und sogar Shadern können Sie fast alles tun, ohne die Treiber zu berühren.
quelle
Sie möchten mit Hardware sprechen. Sie müssen eine Möglichkeit verwenden, mit der Hardware zu kommunizieren. Auf diese Weise ist die Schnittstelle zur Hardware. Das ist es, was OpenGL, DirectX, CUDA, OpenCL und was auch immer sind.
Wenn Sie auf eine niedrigere Ebene gelangen, verwenden Sie nur eine niedrigere Ebene, aber Sie verwenden immer noch eine Schnittstelle, nur eine, die nicht mit so vielen verschiedenen Karten wie die höhere Ebene funktioniert.
quelle
Um 3D - Hardwarebeschleunigung ohne Verwendung einer herkömmlichen API zu erhalten, müssen Sie im Wesentlichen Ihren eigenen Code schreiben, um die Funktionalität des Grafiktreibers zu duplizieren. Der beste Weg, dies zu lernen, ist es, den Code des Grafiktreibers zu betrachten.
Bei NVIDIA-Karten sollten Sie sich das Open Source- Jugendstilprojekt ansehen . Sie haben eine Sammlung von großen Ressourcen hier .
Für andere Grafikkartenmarken finden Sie ähnliche Projekte und Dokumentationen.
Beachten Sie, dass, wie bereits in anderen Antworten erwähnt, die meisten modernen Betriebssysteme verhindern, dass User-Space-Programme direkt auf Hardware zugreifen. Sie müssen also Ihren Code schreiben und ihn als Betriebssystemtreiber installieren. Alternativ können Sie das FreeDOS-Betriebssystem verwenden, für das es keine derartigen Einschränkungen gibt. Sie sollten (theoretisch) direkten Zugriff auf die Hardware haben und ein reguläres Programm schreiben können, mit dem 3D-Grafiken hardwarebeschleunigt dargestellt werden. Beachten Sie, dass selbst die Nutzung des Codes eines vorhandenen Open-Source-Grafiktreibers eine enorme Menge an nicht-trivialer Arbeit wäre (und meines Wissens aus verschiedenen Gründen noch nie durchgeführt wurde) technisch möglich).
quelle
Wenn Sie DirectX oder OpenGl entfernen, werden Abhängigkeiten nicht entfernt, sondern es werden mehr Abhängigkeiten eingeführt. Die anderen Antworten enthalten bereits einige gute Punkte, warum es möglicherweise nicht einmal möglich ist, direkt mit der Grafikhardware zu sprechen (zumindest ist dies nicht möglich), aber meine erste Antwort wäre: Wenn Sie tatsächlich eine Bibliothek geschrieben hätten, die alle gängigen 3D-Elemente abstrahiert Grafikhardware in eine einzige API, die Sie effektiv DirectX / OpenGl umgeschrieben hätten. Wenn Sie Ihren Code zum Schreiben eines Spiels verwenden würden, hätten Sie Ihre neue Bibliothek als neue Abhängigkeit hinzugefügt, genau wie Sie jetzt DirectX / OpenGl als Abhängigkeit haben.
Wenn Sie DirectX oder OpenGl verwenden, sagen Ihre Abhängigkeiten im Grunde genommen "Dieser Code hängt von einer Bibliothek ab, die den Code bereitstellt, der erklärt, wie bestimmte Befehle auf verschiedenen Grafikkarten ausgeführt werden". Wenn Sie ohne eine solche Bibliothek auskommen würden, würden Sie die Abhängigkeit von "Dieser Code hängt von der Grafikhardware ab, die sich genauso verhält wie die Hardware, die zum Zeitpunkt der Erstellung des Spiels vorhanden war."
Mit Abstraktionen wie OpenGl oder DirectX können die Hardwarehersteller eigenen Code (Treiber) bereitstellen, der zu einer gemeinsamen Codebasis führt, sodass Spiele mit größerer Wahrscheinlichkeit auf Hardware ausgeführt werden, die zum Zeitpunkt der Erstellung des Spiels noch nicht vorhanden war.
quelle
Erstens sind CUDA und OpenCL keine Grafik-APIs. Sie sind Apis berechnen.
Das Problem beim Schreiben einer eigenen Grafik-API ist, dass sie sehr komplex ist. Sie können direkt mit der Hardware kommunizieren, es gibt jedoch keine Garantie dafür, dass ein System mit X-CPU, X-GPU, X-RAM-Größe und X-Betriebssystem auf einem System mit Y-CPU, Y-GPU usw. funktioniert. Ein guter Punkt ist, dass DirectX mit Kernelmodustreibern funktioniert. Es ist im Kernel verwurzelt. Außerdem unterstützen Grafik-APIs keine GPUs. GPUs (und ihre Treiber) unterstützen sie. Sie können also so gut wie keine Grafik-API erstellen, es sei denn, Sie erstellen Ihr eigenes Betriebssystem und verwenden von x86 bereitgestellte VGA-Interrupts. Aber Sie wären immer noch nicht in der Lage, eine ordnungsgemäße Schnittstelle mit der GPU herzustellen, und würden bei niedriger Auflösung stecken bleiben.
Ich verstehe, dass Sie alles selbst bauen und keinen Motor oder ähnliches verwenden möchten. Aber das Erstellen einer eigenen Grafik-API würde dem Benutzer nur Unannehmlichkeiten bereiten.
quelle
Sie können Ihren eigenen Treiber und Ihre eigene API schreiben. Es gibt nichts, was Sie daran hindert, außer Ihre Fähigkeiten und Kenntnisse. Wenn es sich nicht um eine gute Lernerfahrung handelt, besteht das eigentliche Problem darin, dass Sie, selbst wenn Sie ein großartiger Programmierer sind, ohne viel Erfahrung mit Grafiken wahrscheinlich nicht wissen, was Sie tun müssen ... oder sogar um anzufangen.
Die Benutzeroberfläche, die Sie selbst erstellen, ist jedoch benutzerfreundlicher und stabiler als etwas, das ständig hinter Ihrem Rücken aktualisiert wird. Daher ist es für mich ein wenig überraschend, dass mehr Menschen diesen Weg nicht gehen, aber in Wirklichkeit haben nur wenige Menschen den technischen Scharfsinn und niemand möchte jahrelang jemanden dafür bezahlen, um zu lernen, wie man das alles macht, und dann möglicherweise sie verlassen die Firma und lassen sie im Stich. Das Gute an der Standardisierung ist, dass die Mitarbeiter viel entbehrlicher werden und die Risiken reduziert werden.
quelle