Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Heilgar Kemmer Geändert vor über 10 Jahren
1
Loops Jason Gregory : Game Engine Architecture Tobias Kemper Softwaretechnologie II (Teil 2) HKI Uni Köln SS 2013
2
Zeit Unterschiedliche Arten von Zeit – Real time – Game time – Local timeline
3
Loops Rendering Loop – Neuberechnung des Bildschirminhalts für jedes einzelne Frame – Für die Erzeugung der Illusion von Bewegtbildern While (!quit) { updateCamera(); updateSceneElements(); renderScene(); swapBuffers(); }
4
Loops Game Loop – Unterhält die interagierenden Subsysteme – Periodisches Updaten der Systeme in unterschiedlichen Raten – Masterschleife
5
void main() // Pong { initGame(); while (true) // game loop { readHumanInterfaceDevices(); if (quitButtonPressed()){ break; // exit the game loop } movePaddles(); moveBall(); collideAndBounceBall(); if (ballImpactedSide(LEFT_PLAYER)){ incremenentScore(RIGHT_PLAYER); resetBall(); } else if (ballImpactedSide(RIGHT_PLAYER)){ incrementScore(LEFT_PLAYER); resetBall(); } renderPlayfield(); }
6
Game Loop Architecture Windows Message Pumps – Nachrichtenschleife, die auf Nachrichten von Windows "lauscht" und nur wenn alle abgearbeitet sind, wieder die Engine arbeiten lässt Callback-Driven Frameworks – in framework basierten engines wurde die Haupt Game loop schon geschrieben und wird vom Programmierer mit Callback-Functions gefüllt Event-Based Updating – Event System im Spiel behält Überblick über interessante Statusänderungen und updated die Subsysteme
7
Abstract Timelines abstrakten Zeitachsen, die relativ zu anderen im System liegen können RealTime wird dabei über den CPU internen Timer in CPU-Cycles gemessen GameTime ist unabhängig von der RealTime und kann für verschiedene Effekte genutzt werden Lokale Zeitachsen für video/animation/audio
8
Zeit messen und mit Zeit arbeiten Menge der Zeit die zwischen Frames vergeht ist bekannt als "Delta Time" Δt 30 FPS -> Δt = 1/30 einer Sekunde Berechnung von Geschwindigkeit (Bsp Raumschiff) Geschwindigkeit v * Δt = Änderung der Position Δx Wichtig: Zeit CPU-Unabhängig machen
9
Zeiteinheiten und Variablen 64-Bit Integer Zeitmesser Extreme Präzision 32-Bit Integer Kurze Zeitabstände mit hoher Präzision 32-Bit Fließkomma Nur für kurze Δt von maximal wenigen Minuten (eher nur single-frame oder weniger) 1/300 Sekunde Zeiteinheit
10
Multiprocessor Game Loops Multicore Prozessoren -> Verlagerung hin zu paralleler Datenverarbeitung Multithreaded Programmdesign Nutzung der Hardware maximieren Ruhezeit minimieren
11
Multicore Architektur nutzen SIMD Fork and Join One Thread per Subsystem Jobs
12
Netzwerk Multiplayer Game Loops Client-Server Modell Peer-to-Peer
13
/
14
QUAKE II
15
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; int time, oldtime, newtime; char *cddir; ParseCommandLine (lpCmdLine); Qcommon_Init (argc, argv); oldtime = Sys_Milliseconds (); /* main window message loop */ while (1) { // Windows message pump. while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { if (!GetMessage (&msg, NULL, 0, 0)) Com_Quit (); sys_msg_time = msg.time; TranslateMessage (&msg); DispatchMessage (&msg); } // Measure real delta time in milliseconds. do { newtime = Sys_Milliseconds (); time = newtime - oldtime; } while (time < 1); // Run a frame of the game. Qcommon_Frame (time); oldtime = newtime; } // never gets here return TRUE; }
16
void Qcommon_Frame (int msec) { char *s; int time_before, time_between, time_after; // [some details omitted...] // Handle fixed-time mode and time scaling. if (fixedtime->value) msec = fixedtime->value; else if (timescale->value) { msec *= timescale->value; if (msec < 1) msec = 1; } // Service the in-game console. do { s = Sys_ConsoleInput (); if (s) Cbuf_AddText (va("%s\n",s)); } while (s); Cbuf_Execute (); // Run a server frame. SV_Frame (msec); // Run a client frame. CL_Frame (msec); // [some details omitted...] } // never gets here return TRUE; }
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.