FPS zu niedrig suche Ideen



  • @knivil:

    Das habe ich so aus einem DirectX-Tutorial.

    @TyRoXx:

    Genau deshlab bin ich hier. Wie kann ich das effiktiver machen?



  • Schon mal 'nen Profiler benutzt?



  • Nein!

    Profiler kenn ich (noch) nicht!



  • Das wird knapp mit der Woche. 🤡



  • Ein Anfang:

    for(int i = 0; i < 64; i++)
            {
                for(int j = 0; j < 16; j++)
                {
                    for(int k = 0; k < 64; k++)
                    {
                        Chunk* chunk = &chunks[i][j][k];
    
                        chunk->get_Vertices();
    
                        //vertices = chunk->vertices + vertices;
    					vertices.insert(vertices.end(), chunk->vertices.begin(), chunk->vertices.end());
    
                        //indices = indices + (short)chunk->indices.size();
    					add_to_each_element(indices, static_cast<short>(chunk->indices.size()));
    
                        //indices = indices + chunk->indices;
    					indices.insert(indices.end(), chunk->indices.begin(), chunk->indices.end());
                    }
                }
            }
    

    Wie viele Vertex Buffer sind das denn bei der zweiten Version bzw. wie viele Chunks?

    Ich finde die Ausschnitte zu unübersichtlich, um qualifizierte Einschätzungen bzgl. der Performance abzugeben. Stell das ganze Projekt doch bei Github oder so rein, dann kann jeder selbst herumprobieren und effektiv die Probleme suchen.
    Das Projekt ist sicher spannend, aber als Anfänger übernimmst du dich ein wenig, fürchte ich. Und wenn das ganze auf deiner Festplatte rumliegt, kann dir kaum jemand helfen.


  • Mod

    wenn version 1 schnell rendert, version 2 schnell updated, dann mach eine version dazwischen, die relativ schnell rendert und relativ schnell updated.

    ach ja, normalerweise sollte man einen profiler benutzen, vielleicht reicht irgendwo schon ein 'reserve' und das problem ist geloest, aber ohne profiler sind solche dinge nur auf gut glueck rauszufinden.

    ein profiler den du versuchen koenntest waere codeanalyst von amd (ja der funzt auch auf intel cpus).



  • knivil schrieb:

    void* pVoid;    // a void pointer
    

    🙂

    void* pVoid;    // a void pointer // a comment
    

    🤡


  • Mod

    hustbaer schrieb:

    knivil schrieb:

    void* pVoid;    // a void pointer
    

    🙂

    void* pVoid;    // a void pointer // a comment
    

    🤡

    // trollt



  • Es sind 64 * 16 * 64 (= 65 536) Chunks. Aber ich lasse nur die Rendern, bei denen auch was drin ist und troztdem müsste die FPS immernoch bei min. 30 liegen, wenn alles gerendert werden muss.

    Und beide Versionen zusammen schweißen, geht nicht! Leiß einfach mal, was die Versionen für anätze haben. Ich kann nicht alle Chunks rendern und doch alle zusammenfügen.

    @hustbaer, knivil und rapso:

    Wäre doch irgendwie komisch, wenns ein int -Pointer wäre, oder?



  • Die erinnerung schrieb:

    Und beide Versionen zusammen schweißen, geht nicht! Leiß einfach mal, was die Versionen für anätze haben. Ich kann nicht alle Chunks rendern und doch alle zusammenfügen.

    Natürlich geht das. Du könntest mehrere Chunks in einem Vertex Buffer zusammenfassen.



  • Das wäre eine Idee. Ich probiere jetzt aber erst das andere aus.

    EDIT: Wie viele Chunks sollte ich zusammen fassen?


  • Mod

    Die erinnerung schrieb:

    Und beide Versionen zusammen schweißen, geht nicht! Leiß einfach mal, was die Versionen für anätze haben. Ich kann nicht alle Chunks rendern und doch alle zusammenfügen.

    erstmal nachdenken, dann posten, wirkt sonst so nach dunning kruger 😉

    @hustbaer, knivil und rapso:

    Wäre doch irgendwie komisch, wenns ein int -Pointer wäre, oder?

    ich hoffe du es ist nur dein humor der da spricht und du hast ein dazulernfaehiges wesen. es ist nicht schlim fehler zu machen, es ist nur schlim sie nochmal zu machen.

    Die erinnerung schrieb:

    Das wäre eine Idee. Ich probiere jetzt aber erst das andere aus.

    EDIT: Wie viele Chunks sollte ich zusammen fassen?

    so dass es am besten laeuft -> konfigurierbar machen und konfigurationen durchtesten bis du die beste findest. ansonsten erwarte von jedem eine andere lottozahl, da niemand ausser dir feststellen kann, welcher wert am schnellsten laeuft.



  • Ok ich probiere es dann mal

    Und kann mir jemand beim optimieren vom Code in den einzelnen Chunks zum erzeugen der Vertices helfen?



  • Die erinnerung schrieb:

    @hustbaer, knivil und rapso:

    Wäre doch irgendwie komisch, wenns ein int -Pointer wäre, oder?

    Wäre aber viel kuhler wenn er einen sprechenden Namen hätte. vertexBufferData oder lockedVertices oder irgendsowas.

    Und ein Kommentar, wo drin steht dass ein void-Pointer ein void-Pointer ist, ist wirklich komplett sinnfrei.

    Weitere Verbesserungsvorschläge (ich hab mir mal nur das eine Beispiel rausgegriffen):

    // Iteration 1: bessere Namen + Scope für den Zeiger:
    
    	{
    		void* lockedVertices = 0;
    		vertexBuffer->Lock(0, 0, &lockedVertices, 0); 
    		memcpy(lockedVertices, vertices.data(), sizeof(CUSTOMVERTEX) * vertices.size()); 
    		vertexBuffer->Unlock();
    	}
    
    	// Iteration 2: Auslagern von Lock/Unlock in eine Helperklasse (die dann Fehlercodes prüft,
    	//     ggf. Exceptions wirft oder read()/write() in NOPs verwandelt wenn was schief gegangen ist - je nachdem was mehr Sinn macht)
    
    	{
    		VertexBufferLock vbl(vertexBuffer, D3DLOCK_DISCARD);
    		vbl.write(0, vertices.data(), sizeof(CUSTOMVERTEX) * vertices.size());
    	}
    
    	// Iteration 3: Auslagern in eine Helper-Funktion
    
    	UpdateVertexBuffer(vertexBuffer, vertices);
    

    Iteration 4 wäre dann CreateVertexBuffer + UpdateVertexBuffer in eine eigene Hilfsfunktion rauszuziehen.

    uswusf.



  • Das macht den Code doch nicht schneller. Eher langsamer! (Ich bin mir sicher, aber nicht 100%)



  • Schreibs in Assembler, nimm SSE und versuchs auf Integerbasis umzusetzen, mach mach Loopunrolling, vermeide zuviele If-Vergleiche, switches und Jumps, achte auf Registerabhängigkeiten und Datenalignement, benutze Cacheperformance, such dir einen anderen Algorithmus, mehr Parallelität...

    hm...unterhalte ich mich jetzt schon mit compilern?...ach egal 🤡



  • Die erinnerung schrieb:

    Das macht den Code doch nicht schneller. Eher langsamer! (Ich bin mir sicher, aber nicht 100%)

    Naja... es gibt schon Fälle wo was dadurch schneller wird, aber eher wird es minimal langsamer oder bleibt gleich.

    Darum geht's aber nicht.

    Es macht nämlich dich beim Programmieren schneller. Das Programm übersichtlicher. Einfach alles besser.



  • Das Problem ist, dass ich auf Millisekunden und weniger achten muss, da ich sowas teilweise 33.554.432 aufrufe. Und eine hunderstel Millisekunde mehr oder weniger macht dann 336 Sekunden Unterschied.

    Ich muss auf sowas achten.



  • Na wenn das so ist kannste ja alle Funktionen als inline deklarieren.



  • Was für ein Spiel erstellst du überhaupt und was passiert bzw was soll dein code da tun?(Man verzeihe mir falls ich das überlesen haben sollte)


Anmelden zum Antworten