PM_Daniel Geschrieben 27. Juli 2016 Melden Share Geschrieben 27. Juli 2016 Hallo Leute! Ich hab wieder mal ein Problem (Wer hätte das gedacht ;P ). Ich bin gerade dabei ein 2D Spiel zu entwerfen bei dem ziemlich viele GameObjects in einer Szene bzw. sogar in in einem Scroll View. Nun möchte ich aber das nur die Objekte die ich sehe Angezeigt werden. Ich habe es mal ganz simpel mit einem Collider auf der Cam versucht und Trigger auf den Objekten. Diese haben dann bei Enter die Objekte aktiviert und bei Exit deaktiviert. Das klappt auch super, doch brauchen die Collider, bzw. die Abfragen mehr Leistung als die Objekte an sich. Gibt es evtl. eine Möglichkeit wie ich das ohne Collider lösen kann? Über Hilfe wäre ich wie immer sehr dankbar! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Ismoh Geschrieben 27. Juli 2016 Melden Share Geschrieben 27. Juli 2016 Sobald dein GameObject ein SpriteRenderer hat könntest du https://docs.unity3d.com/ScriptReference/Renderer-isVisible.html nutzen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 28. Juli 2016 Melden Share Geschrieben 28. Juli 2016 Du weißt aber schon, dass Unity per Default Frustum Culling macht? Was nicht im Bild ist, wird sowieso nicht gerendert. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
PM_Daniel Geschrieben 28. Juli 2016 Autor Melden Share Geschrieben 28. Juli 2016 Guten Morgen! @Ismoh Danke erstmal für den Tipp. Allerdings nutze ich "Image". @Sascha Theoretisch weis ich das, allerdings hab ich im Profiler folgendes stehen (zumindest wenn ich Scrolle): CanvasRenderer.SyncTransform CanvasRenderer.SyncWorldRect CanvasRenderer.SyncClipRect und da jeweils so viel Calls wie Gameobjekte. In meinem Test sind das gerade 10.000. Allgemein hab ich es nun etwas anders gelöst, was allerdings immer noch nicht die beste Methode ist, denke ich.^^ Ich habe den jeweiligen Objekten eine Updatefunktion gegeben in dem abgefragt wird: void Update() { if (transform.position.y < 0 - Range || transform.position.y > 0 + Range) { Button.SetActive(false); } else { Button.SetActive(true); } } An sich kostet das auch viel Leistung, diese liegt aber weit unter allen vorangegangenen Optionen. Evtl kann mir da noch jemand helfen? Hier ein Update: private void Update() { if (Math.Abs(_oldTrans.y - transform.position.y) > 1) { if (_on && Vector2.Distance(new Vector2(0, 0), transform.position) > Range) { transform.GetChild(0).gameObject.SetActive(false); _on = false; } if (!_on && Vector2.Distance(new Vector2(0, 0), transform.position) < Range) { transform.GetChild(0).gameObject.SetActive(true); _on = true; } _oldTrans.y = transform.position.y; } } Preformanter bekomme ich es nicht hin. So läuft es allerdings auch auf meinem Alten Galaxy Express problemlos mit 10k Objekten. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 28. Juli 2016 Melden Share Geschrieben 28. Juli 2016 Ach herrje, hatte übersehen, dass es um einen Canvas geht. Da macht Unity tatsächlich kein Frustum Culling. Aber: http://forum.unity3d.com/threads/ui-elements-culling.360420/ best way would be to add a 2D Rect Mask to the canvas object. this culls the children which i think is what you want. Sollte noch aktuell sein, was da im Thread steht. Versuche mal, das nachzubauen; könnte sich lohnen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
PM_Daniel Geschrieben 28. Juli 2016 Autor Melden Share Geschrieben 28. Juli 2016 @Sascha Hammer! Vielen Dank!!! Im Endeffekt legt man nur ne Rect Mask 2D auf den Canvas und TADA! Spar ich mir den ganzen scheiß ... Mal eben von ca. 18ms auf 4-5ms runter! Also bei 10k Objekten ^^ Absolut Perfekt! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 28. Juli 2016 Melden Share Geschrieben 28. Juli 2016 Na, das ist doch mal was! Freut mich. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.