Jump to content
Unity Insider Forum
PM_Daniel

Objekte in Umgebung Laden

Recommended Posts

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!

Share this post


Link to post
Share on other sites

Du weißt aber schon, dass Unity per Default Frustum Culling macht? Was nicht im Bild ist, wird sowieso nicht gerendert.

Share this post


Link to post
Share on other sites

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. :)

Share this post


Link to post
Share on other sites

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.

  • Like 2

Share this post


Link to post
Share on other sites

@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!

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×