Jump to content
Unity Insider Forum
Vermentex

Performance verbessern mit Culling

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?

 

Share this post


Link to post
Share on other sites

Zu Occlusion Culling habe ich gerade nichts, aber: Frustum Culling macht Unity sowieso. Da brauchst du dich nicht drum zu kümmern.

Share this post


Link to post
Share on other sites

Das schon ausprobiert? GPU Instancing ist Standard auf Aus. Bei zu vielen unterschiedlichen Materialien kann sich die Performance wieder verschlechtern. 

gupinstancing.PNG

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
Am 9.2.2020 um 03:58 schrieb Sascha:

Zu Occlusion Culling habe ich gerade nichts, aber: Frustum Culling macht Unity sowieso. Da brauchst du dich nicht drum zu kümmern.

Oh. Ich hatte gehofft, dass man das dadurch verbessern kann.

Danke für die Berichtigung.

Share this post


Link to post
Share on other sites
vor 18 Stunden schrieb Hermetes:

Das schon ausprobiert? GPU Instancing ist Standard auf Aus. Bei zu vielen unterschiedlichen Materialien kann sich die Performance wieder verschlechtern. 

gupinstancing.PNG

Das habe ich noch nicht probiert. Danke, werde ich heute mal versuchen.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...