![Page 1: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/1.jpg)
PerformanzUnity 4.x Cookbook
Softwaretechnologie II (Teil 2) - Maximilian Berndt
![Page 2: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/2.jpg)
„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“
Feststellung des Problems
![Page 3: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/3.jpg)
1. Reduzierung detaillierter Objekte, Bewegungen und Texturen (Qualitätseinbußen)
2. Verändern des Quellcodes hin zu mehr Effizienz in der Berechnung (Optimierung)
Zwei Möglichkeiten
![Page 4: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/4.jpg)
1. Möglichkeit, bei gleicher Rechenleistung mehr Details oder Objekte darstellen zu können
2. Möglichkeit, unter Beibehaltung des Detailgrades ein flüssiges Spielerlebnis zu bieten
Ziele einer Performanzoptimierung
![Page 5: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/5.jpg)
1. Objekte lokalisieren, die die meisten Ressourcen benötigen
2. Objekte löschen, die nicht länger benötigt werden
◦ Schont sowohl Speicher als auch Rechenressourcen
3. Anzahl aktiver Objekte verringern4. Methoden so selten wie möglich aufrufen5. Aktionen minimieren, die Unity zur
Reflektion zwingen
Lösungsmöglichkeiten
![Page 6: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/6.jpg)
using UnityEngine;public class ProfileScript : MonoBehaviour {
private void Awake() {
Profile.StartProfile(" Spieldauer ");}private void Start(){
Profile.StartProfile(„Rechnung");int answer = 2 + 2;print("2 + 2 = " + answer);Profile.EndProfile(„Rechnung");Profile.PrintResults();
}private void OnApplicationQuit() {
Profile.EndProfile(" Spieldauer ");Profile.PrintResults();
}}
Flaschenhälse finden
![Page 7: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/7.jpg)
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
Erläuterung
![Page 8: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/8.jpg)
using UnityEngine;using System.Collections; public class DisableWhenInvisible : MonoBehaviour {
public Transform player;void OnBecameVisible() {enabled = true;print („ist sichtbar");}
void OnBecameInvisible() {gameObject.SetActive(false);GUILayout.Label („Boot wurde deaktiviert");}private void OnGUI() {float d = Vector3.Distance( transform.position, player.position);GUILayout.FlexibleSpace();GUILayout.Label ("Distanz des Spielers zum Boot = " + d);}
}
Deaktivieren wenn unsichtbar
![Page 9: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/9.jpg)
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
Erläuterung
![Page 10: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/10.jpg)
using UnityEngine;using System.Collections; public class Reactivate : MonoBehaviour {
public GameObject cubeGo;private void OnGUI() {bool makeObjectActiveButtonClicked =
GUILayout.Button("Boot reaktivieren");if( makeObjectActiveButtonClicked )
cubeGo.SetActive(true);}
}
Reaktivieren
![Page 11: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/11.jpg)
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
Erläuterung
![Page 12: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/12.jpg)
using UnityEngine;using System.Collections; public class TimedMethod : MonoBehaviour {
private void Start() {StartCoroutine(Tick()); // wird als Koroutine gestartet}
private IEnumerator Tick() {float delaySeconds = 5.0F; // Verzögerung der Ausführungwhile (true) {print("tick " + Time.time);yield return new WaitForSeconds(delaySeconds);}}
}
TimedMethod
![Page 13: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/13.jpg)
Dient dazu, eine Ausführung aufzuschieben
Sinnvoll, wenn eine dauerhafte Ausführung einer Methode nicht zwingend notwendig ist
Erläuterung
![Page 14: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/14.jpg)
using UnityEngine;using System.Collections; public class SegmentedCalculation : MonoBehaviour {
private const int ARRAY_SIZE = 50;private const int SEGMENT_SIZE = 10; // legt Menge der Elemente fest, die
bei jedem frame berechnet werdenprivate int[] randomNumbers;private void Awake(){
randomNumbers = new int[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
}
SegmentedCalculation
![Page 15: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/15.jpg)
private IEnumerator FindMinMax() {int min = 9999;int max = -1;for(int i=0; i<ARRAY_SIZE; i++){if( i % SEGMENT_SIZE == 0) {print("frame: " + Time.frameCount + ", i:" + i + ", min:" + min + ", max:" + max);yield return null; // setzt Ausführung für einen frame aus}if( randomNumbers[i] > max){max = randomNumbers[i]; } else if( randomNumbers[i] < min) {min = randomNumbers[i];}}
print("** completed - disabling scripted component");enabled = false;}}
SegmentedCalculation
![Page 16: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/16.jpg)
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
Erläuterung
![Page 17: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/17.jpg)
using UnityEngine;using System.Collections; public class PauseMenu : MonoBehaviour {
public bool expensiveQualitySettings = true;private Rect butRect;private float ctrlWidth = 200;private float ctrlHeight = 30;private bool isPaused = false;
void Awake () {butRect = new Rect((Screen.width - ctrlWidth)/2,0,ctrlWidth,ctrlHeight);
}private void Update() {
if (Input.GetKeyDown(KeyCode.Escape)) {
if(isPaused)ResumeGameMode();elsePauseGameMode();
}
}
PauseMenu 1/4
![Page 18: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/18.jpg)
private void ResumeGameMode() {Time.timeScale = 1.0f;isPaused = false;Screen.showCursor = false;GetComponent<MouseLook>().enabled = true;}private void PauseGameMode() {Time.timeScale = 0.0f;isPaused = true;Screen.showCursor = true;GetComponent<MouseLook>().enabled = false;}private void OnGUI(){if(isPaused)PauseGameGUI();}
PauseMenu 2/4
![Page 19: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/19.jpg)
private void PauseGameGUI(){string[] names = QualitySettings.names;string message = "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(); }
PauseMenu 3/4
![Page 20: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/20.jpg)
GUILayout.BeginArea(new Rect(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();}
}
PauseMenu 4/4
![Page 21: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/21.jpg)
Sichtweite Reduzieren
Bereich animierter Objekte eingrenzen
Weitere Möglichkeiten
![Page 22: Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt](https://reader035.vdokument.com/reader035/viewer/2022062312/55204d8249795902118d5374/html5/thumbnails/22.jpg)
1. Objekte lokalisieren, die die meisten Ressourcen benötigen
2. Objekte löschen, die nicht länger benötigt sind
3. Anzahl aktiver Objekte verringern4. Methoden so selten wie möglich aufrufen5. Aktionen minimiere, die Unity zur
Reflektion zwingen6. Sichtweite Reduzieren7. Bereich animierter Objekte eingrenzen
Zusammenfassung