Performanz
Download
1 / 22

Performanz - PowerPoint PPT Presentation


  • 112 Views
  • Uploaded on

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.“

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Performanz' - calvin


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Performanz

Performanz

Unity 4.x Cookbook

Softwaretechnologie II (Teil 2) - Maximilian Berndt


Feststellung des problems
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“


Zwei m glichkeiten
Zwei Möglichkeiten

  • Reduzierung detaillierter Objekte, Bewegungen und Texturen (Qualitätseinbußen)

  • Verändern des Quellcodes hin zu mehr Effizienz in der Berechnung (Optimierung)


Ziele einer performanzoptimierung
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


L sungsm glichkeiten
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


Flaschenh lse finden
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();

}

}


Erl uterung
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


Deaktivieren wenn unsichtbar
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);

}

}


Erl uterung1
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


Reaktivieren
Reaktivieren

usingUnityEngine;

usingSystem.Collections;

publicclassReactivate : MonoBehaviour

{

publicGameObjectcubeGo;

private voidOnGUI()

{

boolmakeObjectActiveButtonClicked = GUILayout.Button("Boot reaktivieren");

if( makeObjectActiveButtonClicked )

cubeGo.SetActive(true);

}

}


Erl uterung2
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


Timedmethod
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);

}

}

}


Erl uterung3
Erläuterung

  • Dient dazu, eine Ausführung aufzuschieben

  • Sinnvoll, wenn eine dauerhafte Ausführung einer Methode nicht zwingend notwendig ist


Segmentedcalculation
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

}


Segmentedcalculation1
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;

}

}


Erl uterung4
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


Pausemenu 1 4
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();

}

}


Pausemenu 2 4
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();

}


Pausemenu 3 4
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(); }


Pausemenu 4 4
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();

}

}


Weitere m glichkeiten
Weitere Möglichkeiten

  • Sichtweite Reduzieren

  • Bereich animierter Objekte eingrenzen


Zusammenfassung
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