1 / 16

Loops Jason Gregory : Game Engine Architecture

Loops Jason Gregory : Game Engine Architecture. Tobias Kemper Softwaretechnologie II (Teil 2) HKI Uni Köln SS 2013. Zeit. Unterschiedliche Arten von Zeit Real time Game time Local timeline. Loops. Rendering Loop Neuberechnung des Bildschirminhalts für jedes einzelne Frame

taber
Download Presentation

Loops Jason Gregory : Game Engine Architecture

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. LoopsJason 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-Functionsgefüllt • Event-BasedUpdating • 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“ • „ForkandJoin“ • „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, intnCmdShow) { 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 (intmsec) { char *s; inttime_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); // [somedetailsomitted...] } // never gets here return TRUE; }

More Related