3D top down performance Problem

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 3D top down performance Problem

    Hallo,

    Ich habe ein Performance Problem bei meinem neuen Projekt. Es ist ein Top down 3D Spiel
    und die Frame rate ist ziemlich schlecht.
    Ich habe mehrere Objekte im raum die eigentlich nur für die Kulisse da sind (Bäume)
    trotz des Codes "instance_deactivate_region(view_xview[0]-150,view_yview[0]-150,view_xview[0]+1180,view_yview[0]+620,false,true);"
    sind ziemlich viele Bäume aktiv (300-600 laut des instance_count codes). Anscheinend kann ich den "deactive" code nicht verwenden.

    Welche Möglichkeiten habe ich denn um die Performance in 3D Spielen zu verbessern ?
    Ich bin noch Anfänger was 3D angeht, also beschreibt es so, dass es jeder verstehen kann ;D

    Danke!

    EDIT: Die bäume sind keine Models und die habe ich so erstellt:

    GML-Quellcode

    1. draw_set_alpha(0.4)
    2. draw_set_color(c_black)
    3. d3d_draw_cylinder(x-32,y-20,0,x+32,y+44,0,-1,1,1,1,20)
    4. draw_set_alpha(1)
    5. draw_set_color(16512)
    6. d3d_draw_cylinder(x-10,y-10,0,x+10,y+10,20,-1,1,1,1,20)
    7. draw_set_color(c_white)
    8. d3d_draw_cone(x-32,y-32,20,x+32,y+32,60,tex,1,1,1,20)
    9. d3d_draw_cone(x-26,y-26,40,x+26,y+26,80,tex,1,1,1,20)
    10. d3d_draw_cone(x-20,y-20,60,x+20,y+20,100,tex,1,1,1,20)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Nico001 ()

  • Hmm, also ich machs genauso mit instance_deactivate_region und es klappt anstandslos...

    Sitzen wirklich 600 Bäume bei dir im Level?

    Du solltest, in einem Objekt gleich mehrere Bäume zeichnen lassen und wenn man durch den Wald vor lauter Bäumen eh nicht durchkann oder soll, nur einen Ring aus Bäumen machen und darin Wände mit Baumtextur platzieren (so wie in alten Spielen, wenn du weisst was ich meine).

    out now: KNOSSOS auf itch.io
    ancient-pixel.com <<< ich freue mich über einen Besuch! ^^
  • Welche Möglichkeiten habe ich denn um die Performance in 3D Spielen zu verbessern ?


    • Culling, Bäume oder Objekte die man überhaupt nicht sieht einfach nicht zeichnen (bei Top-Down ist das relativ einfach).
    • Batching, du hast fünf Drawcalls pro Baum, dass ist zu viel. Packe statische Objekte in ein Model und zeichne das Model in einem Call


    Zeug was der GM 8 leider nicht kann:

    • VertexBuffer (oder was YoYoGames die "neuen" statischen Modelle nennt), zu mindestens geh ich davon das Model nur im Arbeitsspeicher die Vertexdaten hat und die immer wieder zur GPU gesendet werden müssen.
    • Hardware Instancing, mehrere Instanzen von einem Model in einem Drawcall zeichnen. Dafür brauch man zwei Vertex Buffer (einer die Mode Daten, andere die Matrizen zum transformieren (Position)) und einen Vertex-Shader.


    Du bist hier ziemlich beschränkt mit was du die Performance verbessern kann, weil schlichtweg einige Direct3D Funktionen überhaupt nicht verfügbar sind und wenn man die Verfügbar machen würde, würde das ganze den Rahmen vom GameMaker sprengen. (wobei YoYoGames mit GM Studio immer mehr an Direct3D/OpenGL geht).
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Batching, du hast fünf Drawcalls pro Baum, dass ist zu viel. Packe statische Objekte in ein Model und zeichne das Model in einem Call


    Damit kann ich nichts anfangen :D
    So wie ich das verstanden habe:
    Ich soll ein Model erstellen was alle bäume enthält (also quasi ein Modell für die komplette map) und die dann in einem
    befehl anzeigen ?


    EDIT: Ich habe jetzt etwas getestet:
    Create event von controller:

    GML-Quellcode

    1. m_tree=d3d_model_create()
    2. with (obj_tree_test2)
    3. {
    4. d3d_model_cylinder(other.m_tree,x-10,y-10,0,x+10,y+10,20,1,1,1,20)
    5. d3d_model_cone(other.m_tree,x-32,y-32,20,x+32,y+32,60,1,1,1,20)
    6. d3d_model_cone(other.m_tree,x-26,y-26,40,x+26,y+26,80,1,1,1,20)
    7. d3d_model_cone(other.m_tree,x-20,y-20,60,x+20,y+20,100,1,1,1,20)
    8. instance_destroy()
    9. }


    Draw event vom controller:

    GML-Quellcode

    1. d3d_model_draw(m_tree,0,0,0,tex_t2)



    Damit habe ich mir bei 100 bäumen 100 draw events gespart und bei 1000, 1000 draw events.
    Aber trotzdem sinken die FPS noch drastisch. (sind aber schon einmal besser geworden)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Nico001 ()