Performanz
Sponsored Links
This presentation is the property of its rightful owner.
1 / 22

Performanz PowerPoint PPT Presentation


  • 97 Views
  • Uploaded on
  • Presentation posted in: General

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

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

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

Bei Überanspruchung der Ressourcen

Weniger Bilder pro Sekunde, gestörte Wiedergabe, „ruckeln“


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

  • 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

  • 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

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

  • 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

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ä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

usingUnityEngine;

usingSystem.Collections;

publicclassReactivate : MonoBehaviour

{

publicGameObjectcubeGo;

private voidOnGUI()

{

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

if( makeObjectActiveButtonClicked )

cubeGo.SetActive(true);

}

}


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

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

  • Dient dazu, eine Ausführung aufzuschieben

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


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

}


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ä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


PauseMenu1/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();

}

}


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

}


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


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

  • Sichtweite Reduzieren

  • Bereich animierter Objekte eingrenzen


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


  • Login