coco07 Geschrieben 25. Juni 2017 Melden Share Geschrieben 25. Juni 2017 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 More sharing options...
Mr 3d Geschrieben 25. Juni 2017 Melden Share Geschrieben 25. Juni 2017 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 More sharing options...
Zer0Cool Geschrieben 25. Juni 2017 Melden Share Geschrieben 25. Juni 2017 Hast du mal alle Skripte aus der Szene entfernt und nur ein "Standbild" erzeugt, um auszuschließen, daß es an einem Skript liegt? Besonders alle Skripte die an den erwähnten Layers hängen. Was hängt sonst noch an den beiden Layern außer einem Sprite? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
coco07 Geschrieben 25. Juni 2017 Autor Melden Share Geschrieben 25. Juni 2017 Hallo Mr 3d, erst einmal vielen Dank für die Antwort Der Profiler sagt dazu folgendes: 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 More sharing options...
Zer0Cool Geschrieben 25. Juni 2017 Melden Share Geschrieben 25. Juni 2017 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 More sharing options...
Zer0Cool Geschrieben 25. Juni 2017 Melden Share Geschrieben 25. Juni 2017 Hab den Shadercode eben nochmal leicht geändert ... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
coco07 Geschrieben 26. Juni 2017 Autor Melden Share Geschrieben 26. Juni 2017 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: 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: 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 More sharing options...
Zer0Cool Geschrieben 26. Juni 2017 Melden Share Geschrieben 26. Juni 2017 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 More sharing options...
Mark Geschrieben 27. Juni 2017 Melden Share Geschrieben 27. Juni 2017 Gfx.WaitForPresent macht Probleme? Das ist einfach nur der VSync. D>en man per Hardware oder Software Einstellung erzwingen und auch verhindern kann. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
coco07 Geschrieben 28. Juni 2017 Autor Melden Share Geschrieben 28. Juni 2017 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 More sharing options...
Mark Geschrieben 28. Juni 2017 Melden Share Geschrieben 28. Juni 2017 Wenn du immer noch 60FPS bekommst, und egal was du anzeigst nicht darüber kommst, dann denke ich mal dass dein Monitor auch mit 60Hz läuft und VSync immer noch wirkt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 28. Juni 2017 Melden Share Geschrieben 28. Juni 2017 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 More sharing options...
coco07 Geschrieben 29. Juni 2017 Autor Melden Share Geschrieben 29. Juni 2017 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 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.