Jump to content
Unity Insider Forum

Smartphone wird schnell heiß (Android)


Recommended Posts

Hi,

ich bin kurz davor meine Android Simulation in Playstore zu veröffentlichen - nun habe ich aber das Problem, dass mein Smartphone (Samsung Galaxy S7 Edge Android 7.0) super heiß wird in kürzester Zeit. 

Die Framezahl beträgt laut Profiler immer um die 60FPS. Hier mal ein paar Daten aus dem Profiler:

CPU.thumb.jpg.0af7f1757308a1a1af77b8ef34acb215.jpgrendering.thumb.jpg.6b82f1a5c103053af0f43859ff7b64e8.jpgmemory.thumb.jpg.4ca8b35fde7f0fd58d473c48d0d80fcf.jpgaudio.thumb.jpg.5400408c40d9e80ba51972691f0c2c5e.jpgphysics.thumb.jpg.6bd82a54af584f818e95562dadb51b25.jpg

 

Wie man ganz oben sehen kann, ist da nicht wirklich viel vorhanden.

  • Ich verwende keine Realtime Shadows - nur Baked.
  • Bäume haben keine Schatten.
  • Texturen habe ich auf max. 512MB runtergerechnet.
  • Occlusion Culling ist ausgeführt.
  • Terrain Pixel Error habe ich auf 20 (Zeitweise auf 200).
  • Tree Distance auf 190. 
  • In den PlayerSettings habe ich als Graphic API Vulcan als erste - dann OpenGLES3.0 und 2.0. 
  • Multithreaded Rendering off
  • Static Batching on
  • Dynamic Batching on
  • GPU Skinning off
  • Protect Graphic Memory off

 

Ich werde daraus einfach nicht schlau...

Ich denke, ich habe schon so gut wie alle Grundlagen erledigt. Ich habe auch keine unnötigen Update Functions am laufen.

Was könnte ich noch testen? Jemand einen Vorschlag? Wenn mein S7 heiß wird, will ich nicht wissen was bei (älteren) Geräten passiert.

 

Danke und VG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Tja, so ist das mit den Handys. ;)

Man sieht ja ganz deutlich, dass das Rendern am meisten Leistung verbraucht. Deine Drawcalls liegen im gesunden Bereich, aber evtl. kannst du da noch was drehen. Ich sehe nämlich dass du  60 Matrialien hast. Vielleicht kannst du die Anzahl reduzieren und einige Texturen auf einen Textur-Atlas zusammenfügen. Das würde die Drawcalls reduzieren.  Alles was möglich ist auf static stellen.  Lichter reduzieren bzw. auch backen, nicht nur die Schatten. Und wenn doch Lichter benötigt werden, dann nur die nötigen Objekte damit beleuchten. Einfach Shader verwenden. Transparenzen vermeiden. Die Anzahl der Polygone verringern.
Geh das mal durch und schau, was du davon noch nicht umgesetzt hast.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

eigentlich habe ich nur 23 Materials. Texturen auf einen Atlas zusammenfassen werden ich mal probieren. Ansonsten ist alles auf static und Lichter bzw. das Licht wird gebacken. Als Shader kommen nur Standard Shader zum Einsatz. Polygone könnte ich an zwei Stellen noch verringern.

Ich werde das mal umsetzen und testen.

 

Danke und VG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du könntest mal versuchen die Framerate zu drosseln 60 FPS finde ich ziemlich hoch für ein Smartphone, normal würde ich auf 30 gehen und dann hat die GPU bzw. die CPU noch etwas Luft:
https://docs.unity3d.com/ScriptReference/Application-targetFrameRate.html

Ansonsten wenn deine CPU mehrere Kerne hat unbedingt "Multithreaded Rendering off" wieder einschalten, das entlastet den Prozessor auch.
Und dann vielleicht mal schauen was bei dir überhitzt die CPU oder die GPU, sollte man mit einem Temperatursensorprogramm heraus bekommen. Ich vermute allerdings das es die CPU ist. Meine Desktop-PC CPU wird auch sehr warm wenn Unity hohe Frameraten dreht, daher der Tipp mit dem Drosseln der Framerate ...

 void Awake () {
     QualitySettings.vSyncCount = 0;  // VSync must be disabled
     Application.targetFrameRate = 30;
 }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen,

ich hatte vSync schon getestet, wird es aber wahrscheinlich nicht geben bzw. es wird nicht unterstützt, da es mir im Profiler auch nicht angezeigt wurde. 

Die Framerate zu reduzieren bzw. begrenzen hat leider auch keinen Erfolg gebracht. Ich habe die App gestern erst einmal veröffentlicht und warte dann mal auf Feedback (dabei allerdings einen selten dämlichen Fehler gemacht - daher Veröffentlichung aufheben und noch einmal einstellen). Ich könnte mir auch sehr gut vorstellen, dass es an meinem Smartphone liegt.

Es läuft auch problemlos auf einem LG G2 und dieses wird nicht so schnell so warm.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 9.5.2017 um 11:43 schrieb malzbie:

Tja, so ist das mit den Handys. ;)

Man sieht ja ganz deutlich, dass das Rendern am meisten Leistung verbraucht. Deine Drawcalls liegen im gesunden Bereich, aber evtl. kannst du da noch was drehen. Ich sehe nämlich dass du  60 Matrialien hast. Vielleicht kannst du die Anzahl reduzieren und einige Texturen auf einen Textur-Atlas zusammenfügen. Das würde die Drawcalls reduzieren.  Alles was möglich ist auf static stellen.  Lichter reduzieren bzw. auch backen, nicht nur die Schatten. Und wenn doch Lichter benötigt werden, dann nur die nötigen Objekte damit beleuchten. Einfach Shader verwenden. Transparenzen vermeiden. Die Anzahl der Polygone verringern.
Geh das mal durch und schau, was du davon noch nicht umgesetzt hast.

Guten Morgen - Du schreibst ja, dass ich Texturen in einem Texture-Atlas zusammenfügen soll. Wie genau meinst Du das?

 

VG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du jetzt z.B. mehrere Objekte hast, die eigentlich alle das gleiche Material nutzen und sich nur in der Textur unterscheiden, dann hättest du in der regel mehrere Materialien angelegt. Jedes Material würde vom Renderer einzeln bedient.
Hast du aber einen Texturatlas, dann sind da auf einer  (natürlich größeren)  Textur mehrere Texturen vereint. Oben links wäre z.B. die textur füe eine Kiste, oben rechts wäre die Textur für einen Stuhl, unten links wieder für ein anderes Objekt und in der letzten Ecke wieder für ein anderes Objekt.
Wenn alle diese Objekte die gleichen Schaderwerte hätten, könntest du einfach ein einziges Material mit dieser Textur erzeugen und allen 4 unterschiedlichen Objekten zuweisen.
Über die UV Map würde jedes einzelne Objekt sich seinen Bereich der Textur nehmen.
Ein anderes Beispiel wäre ein Männchen, welches unterschiedliche Pullover an haben könnte. Hättest du 4 Plullovertexturen auf dem Atlas, könntest du über den Texturoffset die Textur je nach Pullover verschieben. Du brauchst also nur ein Material und auch nur eine Textur für den Pullover, egal welcher Pullover jetzt angezogen wird.
Diese unterschiedlichen Objekte können jetzt super von Unity gebatcht werden und verbrauchen im besten Fall nur noch einen Drawcall anstatt vier Drawcalls. Wieviele Drawcalls es wirklich sind, ist natürlich abhängig von der Anzahl der Lichter, die darauf treffen und dem Shader des Materials.
Weniger Drawcalls bedeutet wenger Berechnungen für die Grafikkarte.

Hier mal ein Link zu genau dieser Frage (in english) , wo auch ein paar Bilder drin sind, die es gut erklären.
http://answers.unity3d.com/questions/14578/whats-the-best-way-to-reduce-draw-calls.html
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay,

das mit dem Atlas habe ich schon verstanden, allerdings war ich mir bei "verschiedenen" Objekten in einem Atlas nicht sicher. Das bedeutet ja, dass ich die Objekte z.B. in 3ds anpassen müsste, bzw. das UVW Mapping - aber nicht alle Objekte habe ich selbst erstellt. 

Das Bsp. mit dem Männchen würde schon gehen - habe z.B. ÖlTonnen in drei Farben. Da könnte ich Sprites einsetzen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ginge auch bei Objekten, wo du die UVMap nicht erstellt hast. Denn die UVMap ist ja nur ne Positionsangabe auf dem Sheet. Wäre deine Textur jetzt 4 Mal größer als jetzt, würde es ersteinmal nichts ändern, weil die Positionen relativ zu den Dimensionen sind. Du kannst aber über TexturTiling und den Textur-Offset die Relative Position ändern.
Beispiel:

Original Textur für diese UV Map ist 256x256. Du legst jetzt eine Neue Textur an, die 512x512 ist. Die alte Textur kopierst du dir in die neue Textur rein und positionierst sie oben links. Wenn du diese Textur jetzt auf dem Objekt nutzen würdest, würdest du von der alten Textur nur dann Teile sehen, wenn die UVMap auch in den Bereichen vom oberen, linken Viertel hätte.
Stellst du jetzt das Tiling des Shaders auf x=0,5 und y= 0,5 und den Offset auf x=0 und y=0,5, dann sollte deine Textur wieder richtig auf dem Mesh sein. Denn jetzt nimmst du nur ein 4tel der Textur als UVBereich und stellst ein, dass du den oberen linken Bereich haben willst.
Du hast also auch jetzt die Möglichkeit mehrere Texturen für ein Objekt mit nur einem Material zu nutzen, indem du einfach nur den Offset veränderst.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ich habe nun mal folgendes gemacht: Ich habe meine Barrel Texturen (3.Stk) in einer Texture untergebracht. Originalgröße der jeweiligen Texture ist 512x512 - Meinen Atlas habe ich die Größe 1024x1024 gegeben - somit hätte ich die Chance max. 4 Texturen von 512x512 unterzubekommen. Dann habe ich ein neues Material erstellt und die neue Texture dem Material zugewiesen. Dieses eine Material habe ich nun rund 10 Barrels zugewiesen. Mittels Tiling auf 0.5 und Offset Y -2.5 haben nun alle Tonnen die gleich Farbe. Wenn ich nun einer einzigen Tonne eine andere Farbe geben möchte, muss ich dafür doch ein neues Material einsetzen, richtig? Also habe ich in dem Fall "nur" an der Textur gespart - nicht aber an den Materials. Das gleiche ja eigentlich auch bei unterschiedlichen Objekten. Das gleiche Material können die ja nicht besitzen, da dieses ja wenn "global" geändert wird, wenn ich die Offsets anpasse.

Zitat

Wenn alle diese Objekte die gleichen Schaderwerte hätten, könntest du einfach ein einziges Material mit dieser Textur erzeugen und allen 4 unterschiedlichen Objekten zuweisen.

Zitat

Hättest du 4 Plullovertexturen auf dem Atlas, könntest du über den Texturoffset die Textur je nach Pullover verschieben. Du brauchst also nur ein Material und auch nur eine Textur für den Pullover, egal welcher Pullover jetzt angezogen wird.

Deswegen machen mich diese Aussagen etwas stutzig - wie soll ich mehreren Objekten, egal ob gleich oder unterschiedliche (Tisch+Stuhl) nur ein Material zuweisen? Ebenso bei mehreren Objekten die gleich sind, sich halt nur in der Farbe unterscheiden? Das ist was ich gerade nicht so verstehe...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

vor 21 Stunden schrieb malzbie:

Du musst die Änderungen zur Laufzeit machen indem du eine Referenz zum Renderer erzeugst und die dann manipulierst. Dadurch wird dein Material zur Instanz.

 

Ok, aber jede Instanz erzeugt dann auch wieder DrawCalls. Ich habe es nun ein wenig erweitert, in dem ich einfach "haufenweise" Meshes gebaked habe. Gleichzeitig natürlich TextureAtlas und nur ein Material für eine Meshgruppe. Ich erziele damit nun ca. 70FPS - vorher 30FPS.

VG

 

EDIT: 

Achja! Ein ganz wichtiger Punkt war bei mir nun das Terrain - dieses frisst ohne Ende Ressourcen. Hatte es erst mit PixelError versucht, allerdings hatte ich dann Probleme, dass Hügel sich erst kurz vor einem aufbauen. Deswegen habe ich meine Terrainhügel durch Meshes ersetzt, PixelError auf 200 gestellt und nutze das Terrain nun nur für Grundtexturen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

Ok, aber jede Instanz erzeugt dann auch wieder DrawCalls.

Ja, das stimmt. War ja jetzt auch nur erklärt, wie man das verändern kann. Das beste ist immer noch, wenn die UV Maps sich auf dem Sheet schön verteilen. Das geht natürlich nur, wenn du das selber machst.

Deine Werte haben sich schön verändert. Ne Verdoppelung der FPS ist doch klasse! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen,

ja das ist auf jeden Fall klasse! Ich habe immer gedacht, dass es besser ist, Occlusion Culling einzusetzen - allerdings erziele ich mit den gebackenen Meshes deutlich bessere Ergebnisse. Ich glaube aber auch, dass es abhängig von der Spielart bzw. Steuerung ist.

 

Danke und Viele Grüße

Jochen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen!

 

Um dem Hitze Problem weiter auf den Grund zu gehen, habe ich noch ein wenig herum probiert. Vorweg aber kurz: Von jetzt auf gleich bekomme ich max. nur noch "70fps" im Editor - Gfx.WaitForPresent. Das bedeutet doch, dass die CPU auf die Graka wartet. Wenn ich eine neue Scene erstelle und einfach starte ohne Objekte oder sonstwas, komme ich trotzdem nicht über 70FPS. VSync ist aus...! CPU Time lag immer bei 1ms ca. im Editor. Nun durchgehend 15ms. Was kann ich da denn tun? Hat sich gerade erledigt...hatte DXtory im Hintergrund laufen. Hatte es zwar geschlossen aber hat sich dabei wohl aufgehangen...

 

Nun zum Hauptproblem: Ich hatte mir gestern eine neue TesteScene erstellt mit einem Terrain und darin dann ein paar (8Stk.) Objekte die ich mittels Glow Effekt zum leuchten bringe (MK Glow). Das ganze funktioniert auch recht gut - auf dem Android erhalte ich 60-70FPS sofern ich das Smartphone nicht über Unity Debugge, denn das bringt mich auf 30FPS. Der Profiler hat mir angezeigt dass die CPU bei 30-50+ms liegt -_-  Also habe ich eine App heruntergeladen, mit der ich CPU, RAM und Temp während ich die App teste, anzeigen lassen kann. CPU liegt bei 25-30%, Ram bei 50-60% und die Temperatur schießt in kürzester Zeit von 30 auf 60+ hoch. Das Terrain habe ich zudem durch ein Mesh getauscht. 

Hier mal ein kurzer Ausschnitt aus dem Profiler.

testscene_profiler.thumb.png.1e2bf46cb2be7ac890f0de5a0f4fa91d.png

Wie gesagt, ohne Profiler 60FPS und es läuft mega flüssig - Scene ist auch hier mit einem Mesh als Terrain und 8 Objekte mit dem MK Glow Effekt. Eigentlich sieht alles gut aus, auch die CPU Last wenn ich diese auf dem Smartphone via App anzeigen lasse. Aber das Smartphone wird wirklich verdammt heiß und ich habe kein Fieber :D

Ich habe nur ein Licht in der Scene ohne Schatten! Realtime GI ist ausgeschaltet. Alle Objekte sind statisch.

Es fängt ja auch schon an, wenn ich die App starte und nur im Menü bin....

Was könnte das noch sein? Denn vor allem mein Akku leidet darunter (Akku Temp liegt bei ca. 40°).

 

Cheers

 

EDIT: Ich werde es gleich noch einmal versuchen, die Framerate auf 40 oder 30FPS zu begrenzen und lese dann noch einmal alle Daten aus. Vielleicht bringt es ja diesmal was. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...