Jump to content
Unity Insider Forum

Unity2D Performance?


coco07

Recommended Posts

Hallo Community,

ich habe bei meinem neuen Spiel Performance-Probleme, welche ich einfach nicht lösen kann :/ Es handelt sich dabei um einen einfachen 2D Sidescroller. In der Szene vorhanden sind von hinten nach vorne ein Fullscreen Background, 2 breitere Hintergründe(übereinander mit etwas Transparenz), welche Gebäude simulieren und eine Figur im Vordergrund. Die 3 Layer, welchen einen realistischen Hintergrund darstellen sollen, sind einfach Grafiken, welche größtenteils aus nur einer Farbe bestehen. Die Spielfigur lässt sich durch einen Joystick steuern. Wenn ich nun die beiden Layer im Hintergrund entferne, läuft die Spielfigur mit Hilfe des Rigidbodys und der Interpolation sehr flüssig bei 200 FPS hin und her. Sobald die beiden Layer aktiv sind, bricht die Framerate auf rund 30 FPS runter. Als Material wird der "Sprite-Default"-Shader verwendet. Zur Komprimierung der Grafiken wird ein TextureAtlas benutzt. Durch stundenlanges Googlen habe ich dann irgendwann herausgefunden, dass das Phänomen wohl als "Overdraw" bezeichnet wird und dann zu Stande kommt, wenn Grafiken, wie der Name schon sagt, übereinander gezeichnet werden. 

Ist es normal, dass die Framerate von rund 200 FPS auf 30 runter bricht, wenn 3 Grafiken(ca 356x200 Pixel pro Sprite) übereinander gezeichnet werden? Dazu muss ich sagen, dass ich auf einem S3 Mini und einem Amazon Kindle HD 3.gen teste, weil ich das Game auch gerne auf Geräten mit nicht so viel Leistung laufen lassen möchte. Titel à la Candy Crush oder Temple Run(entwickelt mit Unity) laufen allerdings absolut flüssig auf Diesen. 

Auf nem LG G2 läuft mein Game wunderbar mit keinerlei Einbußen...

Kann sich jemand einen Reim darauf machen?

 

Grüße Coco07 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich persönlich kann mir da keinen Reim drauf machen..

Bisher hatte ich noch nie Performance Probleme bei Sprites.. besonders weil deine Texturen auch nur sehr klein sind, dürfte das keinen großen Unterschied machen.

 

Du kannst mal versuchen den Profiler mit 'Deep Profile' einzuschalten, vtl. sieht man dann besser, was den Performancedrop verursacht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Mr 3d, erst einmal vielen Dank für die Antwort :)

Der Profiler sagt dazu folgendes: 

Bildschirmfoto 2017-06-26 um 00.07.44.png

Obwohl hier 60FPS angezeigt werden, ruckelt das Spie, sobald ich in die Nähe der beiden Grafiken komme stark :/

Zer0Cool@ Danke für deine Antwort, hat sich gerade etwas überschnitten :) Es ist nur dieses eine Skript für den Player in der Szene aktiv. Dort wird in der Update Methode nur die Input-Behandlung abgearbeitet. Wenn ich dieses Skript auch noch deaktiviere, kann ich den Player nicht mehr steuern. Allerdings ruckelt es ja nicht, wenn ich diese beiden anderen übereinander liegenden Grafiken entferne. Der Profiler sagt ja auch, dass die CPU auf die GPU wartet. Kann mir allerdings nicht erklären, warum es so lange dauert 3 übereinander liegende Grafiken zu zeichnen :S

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mhh ein Transparent Shader verbraucht zwar ein wenig Performance aber das es so ins Gewicht fällt. Versuch mal einen Shader ohne Transparenz:

Shader "Sprites/DefaultWithoutTransparency"
{
	Properties
	{
		[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
		_Color ("Tint", Color) = (1,1,1,1)
		[MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
	}

	SubShader
	{
		Tags
		{ 
			"IgnoreProjector"="True" 
			"RenderType"="Opaque" 
			"PreviewType"="Plane"
			"CanUseSpriteAtlas"="True"
		}

		Cull Off
		Lighting Off
		ZWrite Off
		Blend Off

		Pass
		{
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma target 2.0
			#pragma multi_compile _ PIXELSNAP_ON
			#include "UnityCG.cginc"
			
			struct appdata_t
			{
				float4 vertex   : POSITION;
				float4 color    : COLOR;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f
			{
				float4 vertex   : SV_POSITION;
				fixed4 color    : COLOR;
				float2 texcoord  : TEXCOORD0;
			};
			
			fixed4 _Color;

			v2f vert(appdata_t IN)
			{
				v2f OUT;
				OUT.vertex = UnityObjectToClipPos(IN.vertex);
				OUT.texcoord = IN.texcoord;
				OUT.color = IN.color * _Color;
				#ifdef PIXELSNAP_ON
				OUT.vertex = UnityPixelSnap (OUT.vertex);
				#endif

				return OUT;
			}

			sampler2D _MainTex;

			fixed4 SampleSpriteTexture (float2 uv)
			{
				fixed4 color = tex2D (_MainTex, uv);
				return color;
			}

			fixed4 frag(v2f IN) : SV_Target
			{
				fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
				c.rgb *= c.a;
				return c;
			}
		ENDCG
		}
	}
} 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank für deine Hilfe :)

Werde ich testen, sobald ich Zuhause bin und gebe dann Rückmeldung :)

 

Edit: So, habe diesen Shader mal eingefügt(zum ersten Mal) und das Ergebnis ist weniger erfreulich :/ Ich habe einen Shader unter Create->Shader->Standard Surface Shader erstellt und deinen Code in das leere Dokument ausgeführt. Dann ein neues Material erstellt und deinen Shader zugewiesen. Ist es richtig, dass ich für jede Grafik, welche diese Shader nutzen soll, ein eigenes Material erstellen muss?

 

Um das mal zu demonstrieren, wie das aussehen soll:

59513c9a64335_Bildschirmfoto2017-06-26um18_55_12.thumb.png.a7d3f557f0345e1c24ea7aecc3490100.png

59513d32a9e85_Bildschirmfoto2017-06-26um18_58_15.png.3af990c64818f6a29255cf1e4123335a.png

 

Sobald diese im Vordergrund stehenden Grafiken im Bild sind, ruckelt es auf dem S3 Mini und Amazon Tablet so stark, dass die Figur beim springen 3 mal so lang in der Luft bleibt. Nehme ich diese raus, ist wieder alles blendend... (Wie gesagt, auf einem stärkeren Smartphone merkt man NICHTS)..

 

Mit dem Shader sieht es so aus:

59513d0fda2ae_Bildschirmfoto2017-06-26um18_57_36.thumb.png.82b3dbc8221dae70837d2beecff53382.png59513d3be20b1_Bildschirmfoto2017-06-26um18_58_04.png.e0edd1295bfe438a64193ddb40b336cb.png

 

Grüße Coco07 :)

 

Edit2: Ich habe jetzt einfach mal ALLES in der Szene deaktiviert bis auf die Kamera. Gfx.WaitForPresent bleibt weiterhin bei über 10ms pro frame, obwohl nichts auf den Bildschirm gezeichnet wird. Das macht doch gar keinen Sinn :/

Link zu diesem Kommentar
Auf anderen Seiten teilen

Denke hast du richtig gemacht. Du erstellst einen neuen Shader und tauscht bei der Vorlage den kompletten Code aus. Dann erstellst du ein neues Material "Sprites-without-Transpareny" und weißt den Shader zu. Ansonsten musst du nur beim Erstellen eines Sprites dann beim Spriterenderer dieses Material einstellen, ansonsten bleibt alles gleich. Der Shader kann dann halt keine Transparenz darstellen und daher muss die Grafik das gesamte Sprite ausfüllen. Macht vermutlich nur Sinn für einen großen Hintergrund wobei die Kamera dann immer nur einen Teil des Hintergrundes erfasst. Warum die Textur nicht zu sehen ist, kann ich nicht erklären, zeigt die richtige Seite des Sprites nach vorn? Sprites können von hinten teilweise nicht gesehen werden.

Schau auch mal ob du nach einem Build auch einen Perf- Einbruch hast, dazu einen FPS Counter  einbauen wo du dann bei einem Build auch die FPS siehst. Ansonsten lösch die Objekte mal in der Szene und schau dann mal.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zer0Cool@ Mit dem Shader hat es jetzt geklappt. Habe es beim ersten Mal wohl einfach verkehrt gemacht. Die Texturen sind jetzt sichtbar und die Performance gefühlt gestiegen :)

Dankeschön nochmal :)

 

Mark@ Habe VSync mal testweise deaktiviert. Das Game läuft zwar flüssiger als vorher, allerdings ist Gfx.WaitForPresent mit ca 5-10 ms noch immer im Profiler zu sehen :/
Dankeschön :)

 

Ich bekomme jetzt dank diesen Änderungen aber fast konstante 60FPS auf dem Tablet und S3 Mini, was ausreichend sein sollte. Bin für weitere "versteckte" Optimierungen trotzdem weiterhin dankbar :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier siehe "V Sync Count" auf "Dont Sync" stellen. Das musst du bei jeder Qualitystufe einstellen (gilt nicht "global" für alle Stufen). Die Stufe die aktuell eingestellt ist wirkt im Editor. Die Defaulteinstellung beim Build hat einen grünen Haken und ist unter dem Icon der Plattform.
https://docs.unity3d.com/Manual/class-QualitySettings.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mark@ Ich teste das Game auf den beiden mobilen Geräten und da komme ich nicht über die 60fps hinweg. Allerdings wird es auf Android irgendwo eine Beschränkung geben. Mehr FPS bringen dem User wohl auch nicht mehr, außer, dass er sein Handy öfter laden darf :D

 

Zer0Cool@ Ich hatte schonmal alles genau so eingestellt und da machte es keinen Unterschied, deswegen hatte ich VSync ohne Hintergedanken wieder aktiviert, um keinen Tearing-Effekt zu bekommen. Diese Einstellungen waren mir deshalb auch bekannt :) Allerdings frage ich mich, warum Unity hier nicht selbst die Dinge mit der Performance regelt, wenn es um mobile Apps geht. Mehr Sinn würde es machen, dass man die Quali hochschrauben kann, wenn man unzufrieden ist, und nicht anders herum :/

 

Danke euch zwei, damit muss ich erstmal leben. Wenn ich noch weitere relevante Performanceupgrades erziele, gebe ich euch Bescheid ;)

 

Dankeschön :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...