Frustum Culling ohne Effekt?



  • Hallo!
    Ich verwende derzeit GLFW und habe eine kleine Szene mit etwa 400.000 Primitives.
    Zur Laufzeit kann ich mit Immediate, DrawArray, DrawArray mit VertexBufferObjects oder Display Lists Rendern - also mit einer Taste durchschalten.

    Wenn ich Immediate, DrawArray oder DrawArray mit VBO verwende und dann FrustumCulling einschalte sieht man einen deutlichen FPS Bonus(tw +40 fps)
    Wenn ich die Models allerdings mit DisplayLists darstelle habe ich unabhängig vom Ein oder Ausschalten des Frustum Cullings gleich viele FPS.
    Nun meine Frage: Wie kann das sein?

    Ich habe VSync deaktiviert - damit ich die "tatsächlichen" FPS sehe, aber da tritt der gleiche Effekt auf.
    Trotzdem sinkt die Framerate nach unten wenn ich weiter aus der Szene herauszoome.
    Sieht fast so aus als wäre da automatisches FrustumCulling dabei 😕

    Dazu sollte ich sagen dass die DisplayLists bei mir einen enormen Bonus bringen.
    Wenn ich meine Szene einfach 12 Mal rendere komme ich auf ~4.500.000 Primitives und habe im Fullscreen Mode trotzdem noch 15 FPS.
    Was ich natürlich sehr begrüße - allerdings würde mich schon interessieren wie es sein kann dass trotz des Renderns der GANZEN Szene bei geringer Distanz (Sprich man sieht nur einen Ausschnitt des Levels) mehr FPS auftreten als bei großer Distanz (Überblick über die gesamte Szene) obwohl ich das Frustum Culling deaktiviert habe....:-/
    MfG


  • Mod

    Gorkosh schrieb:

    Wenn ich die Models allerdings mit DisplayLists darstelle habe ich unabhängig vom Ein oder Ausschalten des Frustum Cullings gleich viele FPS.
    Nun meine Frage: Wie kann das sein?

    tja, watson, das laesst wohl nur einen schluss zu, oder?



  • rapso schrieb:

    Gorkosh schrieb:

    Wenn ich die Models allerdings mit DisplayLists darstelle habe ich unabhängig vom Ein oder Ausschalten des Frustum Cullings gleich viele FPS.
    Nun meine Frage: Wie kann das sein?

    tja, watson, das laesst wohl nur einen schluss zu, oder?

    ➡

    Gorkosh schrieb:

    Sieht fast so aus als wäre da automatisches FrustumCulling dabei

    ??
    Denn das eigene Frustum Culling funktioniert definitiv



  • Noch irgendwelche Anmerkungen, Holmes?


  • Mod

    was ist denn ihnen, mein lieber watson, noch unklar?



  • Mir ist nicht ganz klar, wieso sich das Auto-Frustum-Culling auf Display Lists beschränkt und nicht auch bei DrawArray bzw VBO zum Einsatz kommt...


  • Mod

    weil displaylisten ne fire&forget methode ist fuer leute die nicht viel ahnung haben aber schnell resultate wollen. entsprechend gibt es bei displaylisten unmengen von optimierungen, auch weil oft sehr viel muell reingesteckt wird (eben z.b. 90% unsichtbare polys) und da die beste karte nicht viel helfen wuerde, weil du eben nicht die moeglichkeit hast innerhalb der liste was abzuschalten.

    natuerlich koennte ein treiber pruefen, ob jeder drawcall den du abschickst etwas produziert, ob jede textur die du einlaedst auch wirklich die aufloesung braucht in der du sie bindest und ob sie nicht vielleicht komprimiert werden koennte, ob das resultat nicht das selbe waere wenn du backfaceculling einschaltest usw.
    aber man geht davon aus, dass niemand solche dummheiten begeht, es waere kontraproduktiv fuer die performance wenn der treiber die selben optimierungen vornehmen wuerde wie jeder schon in besserer form in seine applikation einbringen kann, z.b. hierarchisch cullen wie es vermutlich die displaylists machen.



  • Gorkosh schrieb:

    Trotzdem sinkt die Framerate nach unten wenn ich weiter aus der Szene herauszoome.
    Sieht fast so aus als wäre da automatisches FrustumCulling dabei 😕

    Wieso sollte da automatisches Frustum-Culling dabei sein? Spätestens wenn der Rasterizer der Karte ein Polygon übergeben bekommt, prüft der natürlich wieviel davon sichtbar ist. Das muss er ja, denn sonst würde er aus dem Framebuffer rausmalen, sozusagen. Und wenn der eben sieht dass nix sichtbar ist, dann verwirft der das ganze Polygon.

    Kann aber natürlich sein, dass der Treiber selbst ein Bounding-Volume für jede Display-List erstellt, und anhand dessen dann Frustum-Culling betreibt. Das kann er bei Display-Listen, weil Display-Listen sich schliesslich nichtmehr ändern können wenn sie einmal erstellt wurden.

    Frustum-Culling bringt eigentlich nur was, wenn man es selbst macht, und zwar mit ganzen Objenten (anhand ihrer Bounding-Box). (Bzw. wenn der Treiber schlau genug ist, es mit ganzen Objekten zu machen.) Vielleicht ist das auch der Grund, warum die Performance bei dir so schlecht ist, wenn du keine Display-Listen verwendest.


  • Mod

    hustbaer schrieb:

    Gorkosh schrieb:

    Trotzdem sinkt die Framerate nach unten wenn ich weiter aus der Szene herauszoome.
    Sieht fast so aus als wäre da automatisches FrustumCulling dabei 😕

    Wieso sollte da automatisches Frustum-Culling dabei sein?

    weil sein eigenes frustumculling in den anderen faellen was bringt, bei displaylists nichts.



  • hustbaer schrieb:

    Gorkosh schrieb:

    Trotzdem sinkt die Framerate nach unten wenn ich weiter aus der Szene herauszoome.
    Sieht fast so aus als wäre da automatisches FrustumCulling dabei 😕

    Wieso sollte da automatisches Frustum-Culling dabei sein? Spätestens wenn der Rasterizer der Karte ein Polygon übergeben bekommt, prüft der natürlich wieviel davon sichtbar ist. Das muss er ja, denn sonst würde er aus dem Framebuffer rausmalen, sozusagen. Und wenn der eben sieht dass nix sichtbar ist, dann verwirft der das ganze Polygon.

    Kann aber natürlich sein, dass der Treiber selbst ein Bounding-Volume für jede Display-List erstellt, und anhand dessen dann Frustum-Culling betreibt. Das kann er bei Display-Listen, weil Display-Listen sich schliesslich nichtmehr ändern können wenn sie einmal erstellt wurden.

    Frustum-Culling bringt eigentlich nur was, wenn man es selbst macht, und zwar mit ganzen Objenten (anhand ihrer Bounding-Box). (Bzw. wenn der Treiber schlau genug ist, es mit ganzen Objekten zu machen.) Vielleicht ist das auch der Grund, warum die Performance bei dir so schlecht ist, wenn du keine Display-Listen verwendest.

    Was meinst du, soll der Grund sein?
    Die Szene wird in einem Raster aufgebaut und jeder Block darin hat eine eigene Bounding Box(8 Punkte) für Frustum Culling - also eine sehr einfache Abfrage mit 400 Models.
    Das eigene F-Culling bringt eben nur bei den anderen Modes etwas. Was mir jetzt natürlich auch einleuchtet, wenn Display Lists automatisch Culling betreiben.

    rapso schrieb:

    weil displaylisten ne fire&forget methode ist fuer leute die nicht viel ahnung haben aber schnell resultate wollen.

    Erstmal danke für die Antworten aber ich hätte noch eine Frage:
    Was wird denn in den meisten Fällen benutzt - von Leuten die Ahnung haben?
    VBOs mit DrawArray?
    Das bringt meinem Programm auf anderen Rechnern tw. enorme FPS-Boni, aber hat bei mir (und wieder einigen anderen) keinen großen Vor- bzw. manchmal sogar einen Nachteil Gegenüber DrawArray ohne VBOs.
    Und weil es generell eher mit <60 fps dahin-tuckert, bin ich auf Display Lists umgestiegen.

    Mein Rechner ist schon etwas älter, daher ist es tw. nicht leicht zu erkennen ob der Bottleneck im Programm oder der HW liegt.


  • Mod

    Gorkosh schrieb:

    rapso schrieb:

    weil displaylisten ne fire&forget methode ist fuer leute die nicht viel ahnung haben aber schnell resultate wollen.

    Erstmal danke für die Antworten aber ich hätte noch eine Frage:
    Was wird denn in den meisten Fällen benutzt - von Leuten die Ahnung haben?

    ich hoffe du fuehlst dich nicht angegriffen, mit leuten die keine ahnung haben, meine ich welche die nur glVertex benutzen und eben mal speed brauchen, du hast ja VBOs implementiert 😉

    VBOs mit DrawArray?

    ja, das ist der richtige weg normalerweise. wenn es geht, versuch indizierte vertices zu benutzen, weil dann noch ein wenig caching hinzukommt was die sache locker 3mal schneller machen _kann_. dafuer musst du die objekte aber optimieren lassen, dafuer gibt es zum glueck schon fertige libs

    kannst auch gerne hier im forum suchen nach tips, das thema hatten wir hier schon des oefteren wie man sein zeichnen schneller bekommt.

    Das bringt meinem Programm auf anderen Rechnern tw. enorme FPS-Boni, aber hat bei mir (und wieder einigen anderen) keinen großen Vor- bzw. manchmal sogar einen Nachteil Gegenüber DrawArray ohne VBOs.
    Und weil es generell eher mit <60 fps dahin-tuckert, bin ich auf Display Lists umgestiegen.
    Mein Rechner ist schon etwas älter, daher ist es tw. nicht leicht zu erkennen ob der Bottleneck im Programm oder der HW liegt.

    tja, gut profilen ist der key to performance 😉
    auch wenn du keine Nvidia karte haben solltest, da gibt es ein paar tipps wie du genauer rausfinden koenntest woran gerade die performance hinkt.
    wenn du das generel in deine applikation einbaust, koenntest du dir ein log fuer jeden rechner ausgeben und so auch auf fremden kisten mal die performance optimieren.


Log in to reply