Ich kann mich meinen Vorrednern nur anschließen, aber auch von mir noch ein paar Tipps: In meinem Sidescroller habe ich teils hunderte Plattformen (manche (sich drehende) mit komplexen Berechnungen) und sich bewegende oder zerstörbare Entities in einem Level, dazu tausende statische. Die Auslastung der Engine im Funktionsbereich beträgt jedoch nur im Schnitt 0.6-0.7ms samt aller Spieler-Movement und sonstigen Routinen, obwohl ich auch einige wait-Schleifen benutze und diverse Sachen sichtbarkeitsabhängig schalten muss. Alles über ca. fnc 1ms in einem statischen Level ohne Gameplay und sonstigem aktiv ist meiner Meinung nach absolut inakzeptabel, du solltest keine Sekunde an irgendeinem anderen Aspekt weiterarbeiten bis du das in den Griff bekommst.

c_traces für Sichtbarkeitschecks sind (geschwindigkeitstechnisch) absoluter Unsinn, die kannst du getrost alle entfernen. Wenn du in einem Level Tunnel/ gekrümmte Schluchten/ Räume oder sonstiges hast, kannst du mit einfachen würfelförmigen Regionen arbeiten (gibt es zwar nativ erst in A8, aber auch leicht selbst zu implementieren), so dass bspw. Region 1 und 3 ausgeschaltet werden, wenn du dich in Region 4 befindest (bspw. über eine for-Loop über alle dafür registrierten Entities, welche einen Regionsskill auf 1 oder 3 gesetzt haben).

Den Rest sollte dann auch der ABT oder BSP Tree erledigen. Den automatisch BSP Sichtbarkeitscheck (PVS?) kannst du theoretisch trotzdem noch benutzen, indem du große statische Modelle sehr grob mit Blöcken nachmodellierst (du musst einmal prüfen, ob die Sichtbarkeitschecks auch mit "None"-Blöcken, also unsichtbaren, funktionieren, weil das dann deutlich einfacher würde).

Das Rendern von Gras ist eine nicht ganz triviale Angelegenheit, da bei jeder Polygonüberlagerung auf dem gerenderten Bild normalerweise zwischen je zwei Pixeln drei Konvexkombinationen (der Farbwerte) berechnet werden müssen, um die Transparenz zu realisieren. Wenn nun viel Gras/ Vegetation sichtbar ist, oder nur scheinbar viel, wenn es sich im Grunde überlagert, wäre es so als rendertest du fast in einer doppelt so großen Auflösung. Um das zu umgehen, gibt es normalerweise 2 Ansätze: Entweder, du renderst alles mit einem alphaTest-Material, welches dann zwar nur 0% und 100% Transparenz kennt (dafür sehr schnell), oder aber du renderst die Vegetation in einem separaten View bzw. 2mal, einmal als "maximum" Alphamaske und einmal die Farbwerte normal, aber deckend/ nicht transparent. Dann legst du letzteres mittels der Alphamaske über den View und brauchst nur einmal zu blenden (und hast trotzdem eine recht schicke Transparenz). In dem/ den Vegetationsviews könntest du dann auch die Modelle mittels der Shader sanft nach ein paar hundert/ tausend quants ausblenden und den clip_far Wert auf einen niedrigen, etwas größeren Wert setzen. Dann brauchst du dich überhaupt nicht mehr um das Gras zu kümmern, sprich 0 Sichtbarkeits- oder Distanzchecks wären notwendig.


"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual

Check out my new game: Pogostuck: Rage With Your Friends