Bücher zur Spieleprogrammierung ?



  • N Abend Leute,
    weil ich mich sehr dafür interessiere, habe ich vor in der nächsten Zeit das Programmieren von Spielen zu erlernen.

    Dazu habe ich grade bisl durch amazon geschaut und bin auf folgendes Buch zur Spieleprogrammierung ( mit DirectX) gestoßen :
    "3D-Spieleprogrammierung mit DirectX 9 und C++" von David Scherfgen.
    Die Kundenrezesionen auf Amazon dazu sind sehr gut, allerdings hat das nicht unbedingt was zu bedeuten ...

    Kennt jemand von Euch zufällig das Buch und kann was dazu sagen ?

    Wenn nicht, was für Bücher würdet Ihr empfehlen ? ( Ich weiß, dass es im FAQ einen ähnlichen Thread gab, aber der ist mittlerweile 10 Jahre alt)
    Die Bücher können auch auf Englisch sein, aber Deutsch wäre mir bei der komplizierten Materie dann doch lieber.

    Mfg



  • Ich hab das Buch gelesen und finde es eigentlich recht gut. Mein einziger Kritikpunkt wäre der stellenweise zu große Fokus auf seiner TriBase-Engine. Die war mir nämlich völlig egal - ich wollte ja lediglich DirectX lernen.

    Du musst allerdings wissen, dass das Buch nur DX9 behandelt und sich die API von DX9 auf 10 ziemlich geändert hat (von 10 auf 11 hingegen kaum). Wenn du also mit DX9 beginnen willst, könnte ich dir das Buch empfehlen. Wenn du gleich mit DX10 oder 11 einsteigen willst, such dir besser ein anderes.



  • Cool cool, dass es tatsächlich jemand gelesen hat 🙂
    Danke für deine Meinung!
    Zu der DirectX9/10/11-Sache :
    Das ist in der Tat ein Problem. Ich weiß nicht ob es Sinn macht, mit DirectX9 anzufangen, wenn es ja schon DirectX11 gibt.Hmm.
    Leider ist das aktuellste Buch zu dem Thema extrem schlecht bewertet worden ( mit DirectX11). Vllt finde ich eins das DirectX10 behandelt und seine Sache besser macht.

    Nochwas :

    Ist es für die Spieleentwicklung egal ob C oder C++ ? Oder wieso immer die diese Unterteilung " bla mit C/C++" ? Sehe ich immer wieder bei den Büchern.



  • Felixxx schrieb:

    Das ist in der Tat ein Problem. Ich weiß nicht ob es Sinn macht, mit DirectX9 anzufangen, wenn es ja schon DirectX11 gibt.Hmm.

    MEINER Meinung nach macht es keinen Sinn mehr, mit DX9 anzufangen (außer natürlich jemand muss es beruflich machen).

    Felixxx schrieb:

    Leider ist das aktuellste Buch zu dem Thema extrem schlecht bewertet worden ( mit DirectX11). Vllt finde ich eins das DirectX10 behandelt und seine Sache besser macht.

    Ich kenne kein einziges gutes DX10 Buch, und DX11-Buch dementsprechend 3mal nicht. Im Interweb und im DXSDK gibts allerdings viele Einsteiger Samples und sogar Tutorials. Eines wird meistens nicht reichen, aber mit paar verschiedenen Quellen kann man sich meist vorantasten. Bereite dich aber darauf vor, dass die Lernkurve mit D3D10 ziemlich steil verlaufen wird. Ich kann dir garantieren, dass du einige Zeit brauchen wirst, um auch nur ein drehendes Dreieck zu rendern. Danach wirds allerdings besser;)

    Felixxx schrieb:

    Ist es für die Spieleentwicklung egal ob C oder C++ ? Oder wieso immer die diese Unterteilung " bla mit C/C++" ? Sehe ich immer wieder bei den Büchern.

    Ich denke jeder vernünftige Mensch würde mir zustimmen, dass C++ besser geeignet ist. Es bietet einfach mehr Möglichkeiten zur Strukturierung und andere angenehme Features. Ein ganzes Spiel in purem C zu schreiben ist eher was für Masochisten.

    Die meisten Bücher haben wohl "C/C++" im Titel weil sie eine möglichst große Zielgruppe ansprechen möchten und weil sie hässlichen C/C++ Mischcode verwenden.



  • Was D3D9 vs D3D11 angeht: Das hängt imo stark von dir ab. Wenn du sicher in der Handhabung von C++ und deinem Buildsystem bist und auch mal ohne ein Tutorial das dir alles in mundgerechten Happen serviert allein mit einer Doku zurechtkommst dann wird es vermutlich egal sein ob du mit D3D9 oder 11 anfangst. Für weniger Fortgeschrittene bietet D3D9 sicherlich eine sehr viel flachere Lernkurve als D3D11. D3D10 würd ich jedenfalls einfach ignorieren, das heute zu benutzen ist total sinnlos.

    Was C vs C++ angeht: Jeder vernünftige Mensch kommt sowieso nie auf die Idee C zu verwenden wenn er auch C++ verwenden könnte 😉



  • Hmm, hatte schon fast befürchtet , dass es dazu keine guten Bücher gibt.
    Dann mus halt das Internet herhalten, ist sowieso immer die Alternative zum Buch ^^ Werde gleich mal nach den von Dir genannten Stichwörtern googeln und sehen, was ich so finde.
    Vorher frische ich aber kruz noch meine Kenntnisse über Sinus/Cosinus, habe das Gefühl, dass die mir wieder begegnen werden und hab leider total vergessen, wie da was funktioniert hat(Verschiebung,Streckung/Stauchung/...).Sollte sich ja in 30 min wieder komplett auffrischen lassen.

    Dass das Erlernen von der Spieleprogrammierung lange dauert kann ich mir gut vorstellen ^^ Aber solange man es Ettapenweise angeht sollte es relativ spaßig sein ^^

    Auf jeden Fall Danke für die Posts/Meinungen.



  • dot schrieb:

    Was D3D9 vs D3D11 angeht: Das hängt imo stark von dir ab. Wenn du sicher in der Handhabung von C++ und deinem Buildsystem bist und auch mal ohne ein Tutorial das dir alles in mundgerechten Happen serviert allein mit einer Doku zurechtkommst dann wird es vermutlich egal sein ob du mit D3D9 oder 11 anfangst. Für weniger Fortgeschrittene bietet D3D9 sicherlich eine sehr viel flachere Lernkurve als D3D11. D3D10 würd ich jedenfalls einfach ignorieren, das heute zu benutzen ist total sinnlos.

    Was C vs C++ angeht: Jeder vernünftige Mensch kommt sowieso nie auf die Idee C zu verwenden wenn er auch C++ verwenden könnte 😉

    Ich denke leider kaum, dass ich sicher in der Handhabung von C++ und meinem Buildsystem bin.
    Das mit dem auch-ohne-tut-zurecht-kommen kann ich leider schlecht beurteilen, war noch nie nötig :p

    Lol@C vs C++ ^^



  • dot schrieb:

    Was C vs C++ angeht: Jeder vernünftige Mensch kommt sowieso nie auf die Idee C zu verwenden wenn er auch C++ verwenden könnte 😉

    yeah, ich bin also nicht nur frickler, sondern auch noch unvernünftig. am besten ich lass mich mal in die klapse zu den anderen verrückten einweisen (glaub das ding heißt uni oder so 😉 ) da sind wir dann zumindest unter uns 😋



  • Felixxx schrieb:

    Hmm, hatte schon fast befürchtet , dass es dazu keine guten Bücher gibt.

    Du kannst vermutlich die C++ Bücher verwenden, zumindest wenn du C++ Code lesen kannst.
    Im Prinzip musst du nur wo p->FunctionName(...) steht stattdessen InterfaceOfP_Function(p, ...) schreiben.

    Also Beispiel:

    //D3DCAPS9 caps;
    //HRESULT hr = device->GetDeviceCaps(&caps);
    
    D3DCAPS9 caps;
    HRESULT hr = IDirect3DDevice9_GetDeviceCaps(device, &caps);
    

    Oder du verwendest einfach C++ als "besseren C Compiler". Es zwingt dich ja keiner sämtliche C++ Features zu lernen.

    Das mit dem auch-ohne-tut-zurecht-kommen kann ich leider schlecht beurteilen, war noch nie nötig

    OMG ich will nie Code von dir warten müssen 😮



  • Hmm wie meinst Du ? Ich habe C++ nicht C gelernt ^^ Ich weiß also z.B was "->" sein soll, etc.

    Zu der Tut-Sache :
    Naja, ich kann schlecht wissen, wie er das gemeint hat.
    Wenn ich beispielsweise ein Tut lese, wie man einen MouseHook installiert und verwendet, dann schaff ich es halt schon ohne weitere Probleme zum Beispiel einen KeyboardHook analog zu dem was man in dem Tut über Hooks gelernt hat zu schreiben. Generell ausgedrückt kann ich, wenn ich in einem Tutorial die Grundlagen beigebracht bekomme, diese dann erweitert und ohne ein weiteres Tut verwenden; das ist ja wohl ziemlich selbstverständlich.
    Keine Ahnung ob er das gemeint hat o.0



  • So ich knüpf mal mit meinen Fragen an den Thread an.

    Habe bisl im DirectXTutorial.com - Tut gelesen und finde es sehr schön.
    Allerdings sind bei mir paar Fragen aufgetaucht, die ich gerne beantwortet hätte :

    Also, soweit ich mich erinnere steht in dem Tutorial, dass der GPU seinen eigenen Speicher hat, den Video Memory.
    In diesem Video Memory gibt es wohl ein array - den man front buffer nennt (?)-
    in dem die Daten ( Pixel ) eines Bildes, das der GPU zuletz zum Bildschirm geschickt hat, stehen. Bekommt also der GPU den Auftrag ein neues Bild zu "rendern", überschreibt er den front-buffer und schickt das Ganze wieder an den Bildschirm, der dan das Bild refreshed. Das scheint aber für die Spiele-programmierung nicht zu funktioniere, da oft sehr schnell hintereinander Bild an den Bildschirm geschickt werden und dieser damit nicht klar kommt. Somit würden "teared"-Bilder entstehen.
    Um das zu vermeiden schreitet das D3DInterface(?) ein und schreibt selber( / befiehlt dem GPU zu schreiben ?) die Pixel-Daten des neuen Bildes in einen back buffer, wohl die Kopie des front-buffer.
    Habe ich das richtig verstanden ?
    Wen ja, was soll dasbringen ? Die Daten woanders hunzuschreiben ? Der Bildschirm muss doch trotzdem noch das Bild refreshen o.0

    2. Frage
    Folgender Code auf der Website, um DirectX zu initialiseren :

    DirectXTutorial.com schrieb:

    ID3D11RenderTargetView *backbuffer;    // global declaration
    
    // this function initializes and prepares Direct3D for use
    void InitD3D(HWND hWnd)
    {
        // Direct3D initialization
        // ...
    
        // get the address of the back buffer
        ID3D11Texture2D *pBackBuffer;
        swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
    
        // use the back buffer address to create the render target
        dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer);
        pBackBuffer->Release();
    
        // set the render target as the back buffer
        devcon->OMSetRenderTargets(1, &backbuffer, NULL);
    }
    

    Seiner Doku zu dem Code entnehme ich c.a das :
    ID3D11RenderTargetView *backbuffer; -> Der buffer, in den die Pixe-Daten des zu-rendernden Objektes gespeichert werden sollen ?
    ID3D11Texture2D pBackBuffer; -> Nichts anderes als ein 2D-Bild.
    swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID
    )&pBackBuffer); ->

    DirectXTutorial.com schrieb:

    What this GetBuffer() function does is find the back buffer on the swap chain and use it to create the pBackBuffer texture object.

    Verstehe ich wenig ... Wozu brauchen wir jetzt noch ein buffer ? Ich dachte den hätten wir oben deklariert. Streng genommen ja nur ein Pointer, da man COM-Objekte nur indirekt benutzen soll ( richtig ? ), aber trotzdem ...

    dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer); ->

    DirectXTutorial.com schrieb:

    This function creates the render target object. We created the pointer for this object at the top of the program.

    Lol. Hier wird also "Backbuffer" zu einem tatsächlichen Objekt ?

    pBackBuffer->Release();-> Wir sind "fertig" mit der Texture, wurde ja wohl schon auf den backbuffer übertragen?

    devcon->OMSetRenderTargets(1, &backbuffer, NULL);
    ->

    DirectXTutorial.com schrieb:

    This last function actually sets the render target. More exactly, it sets multiple render targets.

    Schon wieder ? Kommt mir irgendwie so vor, als würden wir das gleiche mit verschiedenen Funktionen machen, hmpf.

    Achso : Die Drei Pointer die in dieser Init-Funktion verwendet werden, wurden so deklariert :

    IDXGISwapChain *swapchain;             // the pointer to the swap chain interface
    ID3D11Device *dev;                     // the pointer to our Direct3D device interface
    ID3D11DeviceContext *devcon;           // the pointer to our Direct3D device context
    

    Komm mir iwie bisl dumm vor, nach den paar Seiten Tuts schon so viele Fragen zu haben.
    Trotzdem frage ich lieber 🙂

    Mfg


Log in to reply