1 / 22

Performanz

Performanz. Unity 4.x Cookbook. Softwaretechnologie II (Teil 2) - Maximilian Berndt. Feststellung des Problems. „Performanz ist die Menge nützlicher Arbeit durch ein Computersystem oder Computernetzwerk im Verhältnis zu der dafür benötigten Zeit und den Ressourcen.“

calvin
Download Presentation

Performanz

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Performanz Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt

  2. Feststellung des Problems „Performanz ist die Menge nützlicher Arbeit durch ein Computersystem oder Computernetzwerk im Verhältnis zu der dafür benötigten Zeit und den Ressourcen.“ Bei Überanspruchung der Ressourcen Weniger Bilder pro Sekunde, gestörte Wiedergabe, „ruckeln“

  3. Zwei Möglichkeiten • Reduzierung detaillierter Objekte, Bewegungen und Texturen (Qualitätseinbußen) • Verändern des Quellcodes hin zu mehr Effizienz in der Berechnung (Optimierung)

  4. Ziele einer Performanzoptimierung • Möglichkeit, bei gleicher Rechenleistung mehr Details oder Objekte darstellen zu können • Möglichkeit, unter Beibehaltung des Detailgrades ein flüssiges Spielerlebnis zu bieten

  5. Lösungsmöglichkeiten • Objekte lokalisieren, die die meisten Ressourcen benötigen • Objekte löschen, die nicht länger benötigt werden • Schont sowohl Speicher als auch Rechenressourcen • Anzahl aktiver Objekte verringern • Methoden so selten wie möglich aufrufen • Aktionen minimieren, die Unity zur Reflektion zwingen

  6. Flaschenhälse finden usingUnityEngine; publicclassProfileScript : MonoBehaviour { private voidAwake() { Profile.StartProfile(" Spieldauer "); } private void Start() { Profile.StartProfile(„Rechnung"); intanswer = 2 + 2; print("2 + 2 = " + answer); Profile.EndProfile(„Rechnung"); Profile.PrintResults(); } private voidOnApplicationQuit() { Profile.EndProfile(" Spieldauer "); Profile.PrintResults(); } }

  7. Erläuterung • Skript misst Zeit zwischen Start und Ende des Spiels und für die Dauer der Berechnung (2+2) • Angewandt auf andere Anwendungsgebiete, wie z.B. Ladezeiten lassen sich genaue Angaben über die Performanz machen

  8. Deaktivieren wenn unsichtbar usingUnityEngine; usingSystem.Collections; publicclassDisableWhenInvisible : MonoBehaviour { public Transform player; voidOnBecameVisible() { enabled= true; print(„ist sichtbar"); } voidOnBecameInvisible() { gameObject.SetActive(false); GUILayout.Label(„Boot wurde deaktiviert"); } private voidOnGUI() { float d = Vector3.Distance( transform.position, player.position); GUILayout.FlexibleSpace(); GUILayout.Label ("Distanz des Spielers zum Boot = " + d); } }

  9. Erläuterung • Ständige Entfernungsberechnung vom Spielers zum Objekt bei jedem frame • Sobald OnBecameInvisible() eintritt, wird das Objekt deaktiviert • Keine Update() und OnGUI() Benachrichtigungen mehr, reduziert Rechenkapazitäten • Bei OnBecameVisible() wird das Objekt wieder aktiv

  10. Reaktivieren usingUnityEngine; usingSystem.Collections; publicclassReactivate : MonoBehaviour { publicGameObjectcubeGo; private voidOnGUI() { boolmakeObjectActiveButtonClicked = GUILayout.Button("Boot reaktivieren"); if( makeObjectActiveButtonClicked ) cubeGo.SetActive(true); } }

  11. Erläuterung • Wird zu Reaktivierung benötigt, da gesamtes Objekt „Boot“ inaktiv, also handlungsunfähig • Muss daher mit zweitem Objekt angewandt werden • Hierzu Objekt wählen, dass dauerhaft aktiv ist

  12. TimedMethod usingUnityEngine; usingSystem.Collections; publicclassTimedMethod : MonoBehaviour { private void Start() { StartCoroutine(Tick()); // wird als Koroutine gestartet } private IEnumerator Tick() { floatdelaySeconds = 5.0F; // Verzögerung der Ausführung while (true) { print("tick " + Time.time); yieldreturnnewWaitForSeconds(delaySeconds); } } }

  13. Erläuterung • Dient dazu, eine Ausführung aufzuschieben • Sinnvoll, wenn eine dauerhafte Ausführung einer Methode nicht zwingend notwendig ist

  14. SegmentedCalculation usingUnityEngine; usingSystem.Collections; publicclassSegmentedCalculation : MonoBehaviour { private constint ARRAY_SIZE = 50; private constint SEGMENT_SIZE = 10; // legt Menge der Elemente fest, die bei jedem frame berechnet werden private int[] randomNumbers; private voidAwake() { randomNumbers = newint[ARRAY_SIZE]; // Zufallsinteger werden in Awake() erstellt for(int i=0; i<ARRAY_SIZE; i++) { randomNumbers[i] = Random.Range(0, 1000); } StartCoroutine( FindMinMax() ); // Start der Koroutine }

  15. SegmentedCalculation private IEnumeratorFindMinMax() { intmin = 9999; intmax = -1; for(inti=0; i<ARRAY_SIZE; i++) { if( i % SEGMENT_SIZE == 0) { print("frame: " + Time.frameCount + ", i:" + i + ", min:" + min + ", max:" + max); yieldreturn null; // setzt Ausführung für einen frame aus } if( randomNumbers[i] > max) { max= randomNumbers[i]; } elseif( randomNumbers[i] < min) { min = randomNumbers[i]; } } print("** completed - disablingscriptedcomponent"); enabled= false; } }

  16. Erläuterung • Gerade bei komplexen Berechnungen (AI) ist es oft sinnvoll, nicht alle Berechnungen in einem frame stattfinden zu lassen • Koroutinen • Komplexe Berechnung wird auf mehrere Frames geteilt • Flüssigere Darstellung

  17. PauseMenu 1/4 usingUnityEngine; usingSystem.Collections; publicclassPauseMenu : MonoBehaviour { publicboolexpensiveQualitySettings = true; private RectbutRect; private floatctrlWidth = 200; private floatctrlHeight = 30; private boolisPaused = false; voidAwake () { butRect = newRect((Screen.width - ctrlWidth)/2,0,ctrlWidth,ctrlHeight); } private void Update() { if (Input.GetKeyDown(KeyCode.Escape)) { if(isPaused) ResumeGameMode(); else PauseGameMode(); } }

  18. PauseMenu2/4 private voidResumeGameMode() { Time.timeScale = 1.0f; isPaused = false; Screen.showCursor = false; GetComponent<MouseLook>().enabled = true; } private voidPauseGameMode() { Time.timeScale = 0.0f; isPaused = true; Screen.showCursor = true; GetComponent<MouseLook>().enabled = false; } private voidOnGUI() { if(isPaused) PauseGameGUI(); }

  19. PauseMenu3/4 private voidPauseGameGUI() { string[] names = QualitySettings.names; stringmessage = "Hier kann die Qualität der Darstellung angepasst werden."; butRect.y= (Screen.height - ctrlHeight)/10); if (GUI.Button (butRect,"Weiter")) { ResumeGameMode (); } butRect.y += ctrlHeight + 20; if (GUI.Button (butRect,„Szene schliessen")) { Application.Quit(); }

  20. PauseMenu4/4 GUILayout.BeginArea(newRect(0, 0, Screen.width, Screen.height)); GUILayout.FlexibleSpace(); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); GUILayout.BeginVertical(); GUILayout.Label(message, GUILayout.Width(200)); for(int i = 0; i < names.Length; i++) { if(GUILayout.Button(names[i], GUILayout.Width(200))) QualitySettings.SetQualityLevel(i, expensiveQualitySettings); } GUILayout.EndVertical(); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.FlexibleSpace(); GUILayout.EndArea(); } }

  21. Weitere Möglichkeiten • Sichtweite Reduzieren • Bereich animierter Objekte eingrenzen

  22. Zusammenfassung • Objekte lokalisieren, die die meisten Ressourcen benötigen • Objekte löschen, die nicht länger benötigt sind • Anzahl aktiver Objekte verringern • Methoden so selten wie möglich aufrufen • Aktionen minimiere, die Unity zur Reflektion zwingen • Sichtweite Reduzieren • Bereich animierter Objekte eingrenzen

More Related