Jump to content
Unity Insider Forum

Performance verbessern mit Culling


uumli

Recommended Posts

Hallo, ich benötige ein paar Ideen zum Thema Culling, bzw. allgemein verbesserte Performance.

Ausgangssituation:

Ich habe eine "leere" Scene.

Auf start() werden (einmalig) Objekte instantiiert. Es entsteht mit Hilfe von PerlinNoise eine kleine Welt. 50x50x(max)7 Cubes. Wenn es nacher läuft, vielleicht mehr.

Die Cubes können zur Laufzeit zerstört werden, bzw. neue Cubes können instantiiert werden.

Scene.thumb.png.e1c1db3db15877b13b6d99135ded71ed.png

 

Problem:

Die Anzahl der Cubes sorgt dafür, dass die Performance stark beeinträchtigt ist (Man kann sich als Spieler frei in der Welt bewegen). Hier sollte so etwas wie Occlusion Culling helfen.

Leider kann ich das "build in Occlusion Culling" von Unity nicht nutzen, da meine Welt (zufällig) beim start generiert wird.

Alle meine Ansätze, die Objekte auszublenden, wenn diese nicht im Sichtfeld sind, haben die Performance eher noch verschlechtert.

Weiß jemand, wie man Viewing-frustum culling oder Occlusion Culling hier umsetzen kann?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Man sagt allgemein so viele Cubes erstellen ist nicht gut. 17500 Cubes * 8 Ecken = 140.000 Vertices. Wenn du Culling benutzen tust, muss Culling noch diese Vertices durch loopen. Weiß jetzt nicht wie das aber exakt abläuft.

Daher am besten den Voxel Technik benutzen. Hab damals das hier verwendet: http://studentgamedev.blogspot.com/2013/08/unity-voxel-tutorial-part-1-generating.html

Zum Occlusion Culling. Ich glaube das funktioniert nur bei Dingen in der Scene, die auch Occlusion Static eingestellt haben. Weiß gar nicht, ob es dynamisch geht, also wenn du die Welt generierst und dann. Musst nur noch baken und dann ist das eigentlich fertig. Ups, hab erst gedacht, willst wissen wie das geht.

Also kannst theoretisch selbst machen. Im Discord gibt es jemanden, der sowas ähnliches gemacht hatte, aber dennoch Probleme mit Performance hatte. Im Prinzip fragst du einfach nur ob, ob die Kamera etwas sehen kann, wenn nicht ausblenden (MeshRenderer).
Kannst dazu OnBecameInvisible und OnBecameVisible benutzen. Ich weiß nur nicht, ob das auch gecalled wird, wenn man meshrenderer deaktiviert hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 34 Minuten schrieb MaZy:

Man sagt allgemein so viele Cubes erstellen ist nicht gut. 17500 Cubes * 8 Ecken = 140.000 Vertices. Wenn du Culling benutzen tust, muss Culling noch diese Vertices durch loopen. Weiß jetzt nicht wie das aber exakt abläuft.

Daher am besten den Voxel Technik benutzen. Hab damals das hier verwendet: http://studentgamedev.blogspot.com/2013/08/unity-voxel-tutorial-part-1-generating.html

Zum Occlusion Culling. Ich glaube das funktioniert nur bei Dingen in der Scene, die auch Occlusion Static eingestellt haben. Weiß gar nicht, ob es dynamisch geht, also wenn du die Welt generierst und dann. Musst nur noch baken und dann ist das eigentlich fertig. Ups, hab erst gedacht, willst wissen wie das geht.

Also kannst theoretisch selbst machen. Im Discord gibt es jemanden, der sowas ähnliches gemacht hatte, aber dennoch Probleme mit Performance hatte. Im Prinzip fragst du einfach nur ob, ob die Kamera etwas sehen kann, wenn nicht ausblenden (MeshRenderer).
Kannst dazu OnBecameInvisible und OnBecameVisible benutzen. Ich weiß nur nicht, ob das auch gecalled wird, wenn man meshrenderer deaktiviert hat.

Danke für die Vorschläge. 
OnBecameVisible war mich nicht bekannt. Ich hatte hatte das probiert, indem ich selber Rays werde und schaue, ob der Cube getroffen wird, war aber am Ende langsamer. Ich probiere das. 
Die Voxeltechnik werde ich mir auch mal anschauen. Danke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...