Habrokast "Sunset Manually" # 1. Versuch, eine Umgebung für die Entwicklung eines Spielzeugs für Windows einzurichten

Ich bin gerade auf den Gedanken gekommen - du musst eine Art Hobby finden. Andernfalls können Sie die Spulen entfernen. Und da ich eine sehr nutzlose Person bin, die nur Knöpfe drücken kann, lautet das Hobby: Mindestens einmal pro Woche einen Stream mit dem Schreiben eines Spielzeugs arrangieren. Nach einem Stream wird die Aufzeichnung auf Habré veröffentlicht. (Sie können versuchen, live auf Habr zu posten, aber es ist viel schwieriger).


Das Schreiben ist sehr rückkopplungsorientiert - wenn jemand eine Erklärung braucht, kann ich erklären, wie ich kann. Wenn es Vorschläge gibt, werde ich versuchen, diese zu berücksichtigen. Auf dem Habr werden alle Kommentare bis zuletzt gelesen, an anderen Stellen - wie es geht.


Der erste Pfannkuchen ist hier klumpig:



Unter der Zwischensequenz - eine Beschreibung der These für diejenigen, die zu Recht pleite sind, um eineinhalb Stunden zu verbringen.


Leitideen


Der erste interessante Aspekt ist, dass Sie alles ohne Bräutigam schreiben möchten. Wie geht es einem normalen Javisten? Es gibt ein Problem - Sie finden abhängig davon eine Dunkelheit heraus und es löst das Problem für Sie. Der Preis dafür ist, dass sich das Projekt aufgrund solcher Schweine in einen Schweinestall verwandelt und niemand genau bestimmen kann, was passiert. Ich würde gerne versuchen, ohne diese Schweinefarm sauber und ordentlich zu schreiben. Vielleicht ist das nicht möglich - bitte lassen Sie es uns in den Kommentaren wissen.


Der zweite Aspekt. Ich habe mein ganzes Leben lang Java und PHP programmiert. Es gab Erfahrung in der Entwicklung von Spielzeug, aber nur im Serverteil mit einer Antwort über das Netzwerk und nicht einmal - eine echte Desktop-Anwendung in C ++. Daher wird dies im Wesentlichen eine Freakshow sein - eine Person, die das Problem nicht versteht, wird versuchen, in eigenen Worten zu beschreiben, was passiert.


Nein, das alles hat keinen praktischen Wert. Dies dient dazu, nicht von den Spulen zu steigen und erwachsene bärtige Onkel zu motivieren, auch die Tastatur zu greifen und ein Spielzeug zu zerschlagen.


Routine schlägt ein Nickel


Leider beginnt das Programmieren nie mit einfacher und unterhaltsamer Unterhaltung. Anfänglich gibt es eine Phase schmerzhaften Grabens in der Umgebung und in den IDE-Einstellungen.


Das erste, was ich über Visual Studio verstanden habe, ist ein großartiges Tool für einen Profi, aber es macht einen sehr frustrierenden Eindruck auf einen Anfänger. Nach Eclipse und IntelliJ IDEA ist alles, wie Sie wissen, eine Art unnatürliches, lila, wenig vergebliches Produkt mit einem erneuten Abonnement. Es geht überhaupt nicht um VS, es geht um mich :-)


Und mit Plugins gibt es immer Probleme.




Deshalb verlassen wir Vizhualka durch eine vorsätzliche Entscheidung und sehen, was noch alles ist. Vim, Emacs und andere Editoren, die die Quellstruktur nicht verstehen, werden von der Gesamtstruktur gesendet. Der erste Versuch, Eclipse zu verwenden, schlug fehl, daher wurde das Tool als CLion ausgewählt .


Das Problem mit CLion ist, dass es mit dem Visual Studio-Compiler immer noch nicht vollständig funktioniert. Wenn Sie versuchen, etwas darin zu tun, sieht es folgendermaßen aus:




Natürlich würde es einen Faden geben, der in die Goshniks läuft und mit hoher Stimme anfängt zu schreien, dass es genug Debugging-Drucke für alle geben würde. Aber wir werden ihnen natürlich nicht zuhören.


Daher benötigen Sie, was CLion gut kann, und dies ist MinGW.


MinGW auswählen


Es gibt eine große Versionstabelle .




Und es zeigt, dass es sinnvoll ist, nur Cygwin und Msys2 zu betrachten. Msys2 ist irgendwie komisch - es hat nur wenige Committer, die Pakete befinden sich auf dem persönlichen Github eines der Autoren. Auf der anderen Seite ist es wirklich cool - es gibt einen neuen Compiler und eine Reihe von Paketen. Das ist entscheidend.


Die Installation besteht darin, next-next-ok aufzurufen und dann den Aktualisierungsbefehl ( pacman -Syu , wie in Archlinux) wiederholt auszuführen, wobei das Msys2-Terminal neu pacman -Syu , bis angezeigt wird, dass alles pacman -Syu funktioniert hat.


Wenn Sie Msys2 einfach gemäß den Anweisungen installieren und versuchen, es zu CLion hinzuzufügen, wird keine Toolchain gefunden. Sie müssen es selbst installieren. Dies erfolgt mit dem Befehl pacman -S mingw-w64-x86_64-toolchain .


Nach der Installation dieses Pakets startet CLion helloworld (das beim Erstellen eines neuen Projekts automatisch generiert wird) und das Debuggen funktioniert darin.


Feature Check # 1: Ein einfaches Fenster


Zunächst möchte ich verstehen, ob zumindest eine Desktop-Anwendung überhaupt gestartet wird. Dies ist jedoch nicht das native PlatformSDK, sondern MinGW.


Hierzu eignet sich ein einfaches Programm , das mit vinapi ein Fenster zeichnet.


Und ja, mit MinGW geht es los. Aber mit der Visual Studio-Toolchain werden einige Fehler ausgegeben, aber ich habe sie nicht behandelt, weil - aber warum, wenn die Zielplattform bereits für uns funktioniert?


Feature Check # 2: Dreieck mit Shader


Es ist klar, dass es nicht ausreicht, Pixel im Fenster anzuzeigen, um etwas Lebensfähiges zu schreiben. Es bremst, ist unangenehm, es gibt keine ausgefallenen Sachen. Kurz gesagt, wir brauchen DirectX.


Die Schlüsselfrage zu CLion + MinGW lautet: Wenn sie DirectX nicht verwenden können, werden sie in den Papierkorb verschoben.


Zum Testen wurde ein sehr kurzes Tutorial gegoogelt, das nur aus zwei Dateien bestand: in einer den gesamten C ++ - Code, in der anderen einen Shader. Die Herausforderung besteht darin, es zum Laufen zu bringen.


Zusätzlich zur Einzeldatei-Natur ist dieses Tutorial sehr gut, da es an den Fingern erklärt, wie es funktioniert. Vielleicht sollte dieser Artikel an Habr übertragen werden (in Kommentaren schreiben).


Das fertige Ergebnis ist hier GitHub . Hier werde ich beschreiben, welche Probleme aufgetreten sind.


Kleinigkeiten und Müll


Viele L-Linien sind nur noch Strings. Sie können die Buchstaben L löschen. An vielen Stellen müssen Sie NULL durch 0 ersetzen, damit es nicht herunterfällt.


Trotz der Tatsache, dass set(CMAKE_CXX_STANDARD 17) , passierte in dieser Hinsicht überhaupt nichts Interessantes, nichts fiel auseinander.


Header und Libs


Tatsache ist natürlich, dass dieses Beispiel sehr alt ist und in den Tagen vor Windows 10 geschrieben wurde. DirectX befindet sich nicht mehr in einem separaten DirectX-SDK wie in den Tagen unserer umstrittenen Jugend, sondern wird direkt in das Windows-SDK verschoben.


Führen Sie daher zunächst das Visual Studio-Installationsprogramm aus und überprüfen Sie, ob die neueste Version des Windows SDK installiert ist.


Die zweite Frage steht in den Schlagzeilen.


 #include <d3d11.h> #include <d3dx11.h> #include <d3dx10.h> 

Sie sind nicht mehr, du brauchst so etwas wie:


 #include <d3d9.h> #include <d3d10.h> #include <d3d11.h> #include <dxgi.h> 

Fügen Sie dann in CMakeLists am Ende der Datei eine Suche hinzu:


 set(LIBS d3d9 d3d11 d3dcompiler_43) target_link_libraries(src ${LIBS}) 

Fehlende APIs


Zuvor gab es eine solche Struktur :


 typedef struct D3DXCOLOR { FLOAT r; FLOAT g; FLOAT b; FLOAT a; } D3DXCOLOR, *LPD3DXCOLOR; 

Und sie ist nicht mehr. An allen Stellen, an denen es wirklich benötigt wurde, stellte sich heraus, dass D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f) durch {0.0f, 0.2f, 0.4f, 1.0f} .


Das Problem stellte sich mit der D3DX11CompileFromFile als interessanter D3DX11CompileFromFile . Sie ist nicht mehr!


In dem Artikel Leben ohne D3DX wurde vorgeschlagen, es durch D3DCompileFromFile zu ersetzen.




Aber hier ist das Problem: D3DCompileFromFile ist aus irgendeinem Grund auch nicht verfügbar!


Eine kleine Untersuchung ergab, dass die Microsoft-Dokumentation die Verwendung einer sehr neuen Version der API vorschlägt:




Und MinGW schickt uns für einige Jahre in die Vergangenheit zurück:




In der 32-Bit-Version gibt es jedoch einen neueren Header, aber ich habe nicht verstanden, wie man ihn zu 64-Bit hinzufügt. 32 Bits auf, wahrscheinlich in den Figuren, gaben nicht auf.


Einerseits ist dies sehr traurig, da es in Zukunft eine Blutung in einer Beziehung mit MinGW anzeigt. Ich frage mich, wer die Manieren all dieser Angelegenheiten sind.


Wenn wir andererseits das fehlende D3DCompile und das aktuelle D3DCompileFromFile :


 HRESULT WINAPI D3DCompileFromFile( in LPCWSTR pFileName, in_opt const D3D_SHADER_MACRO pDefines, in_opt ID3DInclude pInclude, in LPCSTR pEntrypoint, in LPCSTR pTarget, in UINT Flags1, in UINT Flags2, out ID3DBlob ppCode, out_opt ID3DBlob ppErrorMsgs ); 

 HRESULT WINAPI D3DCompile( in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName, in_opt const D3D_SHADER_MACRO pDefines, in_opt ID3DInclude pInclude, in_opt LPCSTR pEntrypoint, in LPCSTR pTarget, in UINT Flags1, in UINT Flags2, out ID3DBlob ppCode, out_opt ID3DBlob ppErrorMsgs ); 

es stellt sich heraus, dass es nur folgenden Unterschied gibt:


  in LPCWSTR pFileName, 

gegen


  in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName, 

Leider kenne ich C ++ nicht und habe Ihnen daher erklärt, wie ich es könnte: Ich habe gerade die D3DCompile hinzugefügt und diese Daten zu D3DCompile umgeleitet.


 void WINAPI D3DCompileFromFile(const char *filename, const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint, const char *target, UINT sflags, UINT eflags, ID3DBlob **shader, ID3DBlob **error_messages) { SIZE_T data_size; char* buffer; ifstream infile; infile.open(filename, ios::binary); infile.seekg(0, ios::end); data_size = infile.tellg(); infile.seekg(0, ios::beg); buffer = new char[data_size]; infile.read(buffer, data_size); infile.close(); D3DCompile(buffer, data_size,filename, defines, include,entrypoint, target, sflags, eflags, shader, error_messages); } 

Der einzige wichtige Unterschied zwischen dem D3DX11CompileFromFile und unserem selbst erstellten D3DCompileFromFile ist das Fehlen einer ID3DX11ThreadPump als Parameter in der neuen API. Ist das etwas für Asynchronität, vielleicht eine Art Thread-Pool? Er wurde jedoch nicht im Tutorial verwendet, es gibt 0 an seiner Stelle.


Zusammenfassung


Eine Reihe von DirectX + MinGW + Msys2 + CLion ist lebensfähig genug, um ein einfaches Spiel zu schneiden. Es besteht die Möglichkeit, nicht nur die Basis-Vinapi zu verwenden, sondern auch zu zeichnen und sogar mit Shadern.


Im Allgemeinen ist das alles. Ich erinnere Sie daran, dass das einfache Ergebnis auf GitHub liegt .


Bitte denken Sie daran, dass dies nicht mein Code ist, sondern ein geänderter Text aus dem Tutorial . Ich hoffe jedoch, dass seine Verwendung ehrlich und zielgerichtet ist. Trotzdem gibt es dort keine normale Lizenz .




Feedback


Bitte schreiben Sie Ihre Kommentare und Vorschläge in die Kommentare. Um dies zu erreichen, ist alles erledigt. Hören Sie zu, was Sie sagen. Vor allem, wenn Sie ein erfahrener Spielprogrammierer sind, nur ein Bison, ein Bison, und Sie passen nicht in einen Thread nach Größe. Seien Sie sicher, dass Sie hereinkommen und etwas schreiben.


Ich erinnere dich daran, dass ich, wie jeder andere Blogger, Likes und Designs esse. Je heftiger Sie den Aufwärtspfeil unter diesem Beitrag spielen, desto wahrscheinlicher wird der nächste Beitrag und Stream herauskommen.


                  

© Alexander Raevsky

Source: https://habr.com/ru/post/de424971/


All Articles