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

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
Klassen - Verkettete Liste -
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Kapselung , toString , equals , Java API
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Datenstrukturen Look-Up Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung.
VO2 Laden und Initialisieren der Sounds. Wir wollen Sounds in unsere Applikation laden Menü erweitern –um den Menüpunkt Sound –mit dem Identifier ID_ULTRIS_SOUND.
Ultris Version 8: Erzeugen der Formen und Anzeigen der Vorschau
Ultris V10 Bewegen, Drehen und Kollisionserkennung.
Verteilte Software - Java - Prozedurale Programmierung 1
Threads Richard Göbel.
Java: Dynamische Datentypen
Listen Richard Göbel.
Assoziationen (Beziehungen) 1 : n. Zu einem Auto gibt es mehrere Fahrer (2) und zu diesen 2 Fahrern gibt es genau dieses Auto.
Polymorphie (Vielgestaltigkeit)
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
V09 Fallende Formen, Geschwindigkeitsregelung und Timing Daniel Ebner Spieleprogrammierung mit DirectX und C++
Softwaretechnologie II WS 08/09 SpieleProgrammieren UlTris V07 Reihen vorbelegen, Spielfeld anzeigen und Punktestand ausrechnen Sibylle C. Schellhorn,
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Zusammenfassung Vorwoche
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Einführung in die Programmierung Datensammlung
Thema: Fibonacci-Zahlen
Bestimmung des ggT zweier Zahlen
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Einfach verkettete Listen (OOP)
Objektorientierte Modellierung
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Grundkonzepte Java - Klassendefinition
Java programmieren mit JavaKara
Guten Nachmittag!.
Wir haben gesehen Das Gerüst ist bei JavaKara fix vorgegeben
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Einführung in die Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Von der Planung bis zum Hauptmenü Seminar: Softwaretechnologie II Dozent: Prof. Manfred Thaller Referent: Jan Bigalke.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Informatik 1 Letzte Übung.
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
Dynamische Datentypen
Einführung in JavaKara
Purga - Scriptengine Ein Einblick.
Java-AG Benutzeroberflächen Juni 2001 Michael Haas.
Programmiervorkurs WS 2014/15 Methoden
Programmiervorkurs WS 2014/15 Schleifen
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
1 // Heap als ADT // JW: V1.0 // Vorlage gemaess EED-Quelltext // #include #include // für double pow (double d, int i) #include // fuer INT_MIN.
ROBERT NYSTROM GAME PROGRAMMING PATTERNS III.8 Thema: Sequencing Patterns Seminar: Softwaretechnologie II (Teil 2) Dozent: Prof. Dr. Manfred Thaller Referent:
GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.
Controller Werkstatt updaten Werkstatt ws = werkstattarray.get(werkstattId); ws.setName(name); ws.setAnsprechpartner(ansprechpartner); ws.setTelefonnummer(telefonnummer);
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Felder in Java.
 Präsentation transkript:

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

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

1. Reduzierung detaillierter Objekte, Bewegungen und Texturen (Qualitätseinbußen) 2. Verändern des Quellcodes hin zu mehr Effizienz in der Berechnung (Optimierung)

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

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 verringern 4. Methoden so selten wie möglich aufrufen 5. Aktionen minimieren, die Unity zur Reflektion zwingen

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

 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

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

 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

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

 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

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ührung while (true) { print("tick " + Time.time); yield return new WaitForSeconds(delaySeconds); }

 Dient dazu, eine Ausführung aufzuschieben  Sinnvoll, wenn eine dauerhafte Ausführung einer Methode nicht zwingend notwendig ist

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 werden private 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 }

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

 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

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

private void ResumeGameMode() { Time.timeScale = 1.0f; isPaused = false; Screen.showCursor = false; GetComponent ().enabled = true; } private void PauseGameMode() { Time.timeScale = 0.0f; isPaused = true; Screen.showCursor = true; GetComponent ().enabled = false; } private void OnGUI() { if(isPaused) PauseGameGUI(); }

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

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

 Sichtweite Reduzieren  Bereich animierter Objekte eingrenzen

1. Objekte lokalisieren, die die meisten Ressourcen benötigen 2. Objekte löschen, die nicht länger benötigt sind 3. Anzahl aktiver Objekte verringern 4. Methoden so selten wie möglich aufrufen 5. Aktionen minimiere, die Unity zur Reflektion zwingen 6. Sichtweite Reduzieren 7. Bereich animierter Objekte eingrenzen