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

Performanz PowerPoint PPT Presentation


  • 88 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

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

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

}

}


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


  • Login