Programowanie gier komputerowych Tomasz Martyn Wykład 1. Silnik gry
Podstawowy cel silnika: Co to jest silnik gry? Wielokrotne wykorzystanie istniejącego kodu do tworzenia różnych gier Granica między silnikiem a samą grą jest często rozmyta Na ogół przyjmuje się, że pojęcie architektura sterowana danymi (data-driven architecture) wytycza granice między grą a jej silnikiem Recepta na wyodrębnienie silnika z gry: Usuń z gry zasoby i reguły gry, a to, co zostanie, to będzie silnik
Przykładowe silniki gier Rodzina quake owa (Id software): - Doom - pierwszy silnik z prawdziwego zdarzenia -Quake III Arena - umożliwiał tworzenie pierwszych moddów Source (Valve Corporation) UDK i Unreal Engine 1-3 (Epic Games) CryEngine 1-3 (Crytek) Unity 3D silniki open source owe: Ogre, Irrlicht, Troque, Crystal Space
Składniki silnika gry Dzisiejsze, profesjonalne silniki gier są dużymi pakietami programowymi, w których można wyodrębnić dwie podstawowe składowe: 1. silnik właściwy (real-time game engine) na podstawie dostarczonych danych (reprezentujących zasoby audio-wideo, logikę, mechanikę, fizykę, ) generuje ( napędza ) grę 2. zbiór rozmaitych narzędzi wspomagających tworzenie gry edytory zasobów (pomieszczeń, terenów, materiałów, animacji, cząstek, ), edytor graficzny logiki gry, IDE skryptów, zarządca/ wyszukiwarka zasobów, konwertery (import/eksport) danych,
Architektura silnika gier 3D
Warstwy niskiego poziomu
Warstwa zewnętrznych API Algorytmy i struktury danych - STL (STLPort, EASTL), Boost, Grafika DirectX OpenGL libgcm niskopoziomowe API graficzne Sony dla RSX (PS3) Edge wysokopoziomowe, wydajne API graficzne firm Naughty Dog i Sony dla PS3 Fizyka - Physix - Havok - Open Dynamics Engine Animacja postaci - Granny - Havok Animation - Edge - Endorphin i Euphoria (Natural Motion Ltd.) AI - Kynapse
Warstwa niezależności od platformy Obudowuje i/lub zastępuje wywołania funkcji systemowych i interfejsy różnych API.
Moduły podstawowe Warstwa obejmuje m.in.: -zarządzanie pamięcią szybkie przydzielanie i zwalnianie pamięci, zapobieganie fragmentacji -bibliotekę matematyczną operacje na wektorach i macierzach, kwaterniony, operacje geometryczne (wyznaczanie przecięć pomiędzy obiektami geometrycznymi, wyznaczanie brył ograniczających, etc.), rozwiązywanie układów równań, całkowanie numeryczne -własne algorytmy i struktury danych (np. zamiast bibliotek zewnętrznych typu STL/Boost)
Klasy zasobów i zarządca zasobów Podstawowe funkcje zarządcy zasobów: udostępnia jednolity interfejs (lub grupę interfejsów) do ładowania i usuwania różnego rodzaju zasobów gry zarządza umieszczaniem zasobów w pamięciach różnych rodzajów w czasie działania gry zapobiega wielokrotnym przydziałom pamięci dla tego samego zasobu
Silnik graficzny (1): Renderer Zastosowanie: Pobieranie obiektów graficznych i jak najszybsze ich renderowanie (zwykle bez brania pod uwagę, które z nich są aktualnie widoczne) Graphics Device Interface -wyliczanie urządzeń graficznych dostępnych w systemie (np. 2 lub więcej kart) i ich inicjalizacja odpowiednim ustawieniem parametrów bufora ramki (z-bufor, bufor koloru, bufor szablonu) -integracja renderera z pętlą komunikatów systemu operacyjnego dostarcza abstrakcję kamery (frustum bryłę widzenia, płaszczyzny obcinania, etc.) oraz widoku (viewport) i tworzy między nimi połączenie obsługuje system materiałów i shaderów obsługuje system oświetlenia, w tym często oświetlenie globalne (obliczane w fazie obliczeń wstępnych) udostępnia funkcjonalność renderowania debugowego (niewypełnione siatki wielokątów - wireframe)
Silnik graficzny (2): Graf sceny, wstępna selekcja obiektów i LOD Zastosowanie: Przeszukuje scenę celem wyznaczania obiektów graficznych, które są potencjalnie widoczne (PVS), oraz określa wymagany poziom szczegółowości prezentowanych obiektów (Level Of Detail) selekcja obiektów względem bryły widzenia (frustum culling) grafy sceny i struktury podziału przestrzennego (BSP tree, quad- i octree, kd-tree, hierarchie brył ograniczających) portale (portal culling) selekcja obiektów względem zasłaniania (occlusion culling) poziom szczegółowości (LOD)
Silnik graficzny (3): Warstwa efektów systemy cząstek (dym, ogień, rozbryzgi wody, ) kalkomanie (dziury po pociskach, ślady stóp, ) mapowanie oświetlenia (light mapy oświetlenia globalnego) odbicia lustrzane otoczenia (environment mapping) dynamiczne cienie zaawansowane elementy oświetlania w czasie rzeczywistym (np. Precomputed Radiance Transfer, HDR) efekty post-procesingu
Warstwa interfejsu HUD i GUI (wybór broni, konfigurowanie jednostek, wydawanie rozkazów, ) różnego rodzaju menu (np. do konfigurowania różnych parametrów samej gry: rozdzielczość, stopień trudności, ) Dodatkowo: odtwarzanie nagranych wcześniej cut-scenek (FMV) in-game cinamatics (IGC) stałe sekwencje ruchu kamery wbudowane w rozgrywkę (np. przelot kamery nad sceną celem ukazania pola bitwy)
Profilowanie i debugowanie konsola i inne narzędzia deweloperskie (finalnie dostarczane z grą lub nie) mierzenie czasu wykonania wyświetlanie różnego rodzaju statystyk dotyczących zasobów podczas działania gry nagrywanie zdarzeń gry w celu ponownego odtworzenia danej sekwencji
Warstwa fizyki Obecnie w profesjonalnym tworzeniu gier zwykle korzysta się z gotowych silników fizycznych: Havok PhysX Box2D (w silnikach gier 2D)
System animacji Obecnie w grach 3D najczęściej wykorzystywana jest animacja szkieletowa i morfing (głównie do animacji twarzy) System animacji szkieletowej powiązany jest z: - rendererem za pośrednictwem modułu realizującego nakładanie skóry na szkielet (skinning) - fizyką za pośrednictwem podsystemu realizującego fizykę szmacianych lalek (rag dolls)
Warstwa I/O - obsługuje I/O różnych kontrolerów gracza (klawiatura i mysz, joypady, kierownice, maty, WiiMote ) - umożliwia stworzenie przez gracza własnego odwzorowania pomiędzy możliwymi akcjami kontrolera i akcjami gry - wykrywa sekwencje wciskanych klawiszy -
System dźwięku Digital Sound Processing i efekty dźwiękowe dźwięk przestrzenny (wielokanałowy 5.1 i 7.1) odtwarzanie (i niekiedy zarządzenie) Przykładowe systemy: - XACT Microsoft (PC i Xbox 360) - SoundR!OT Electronic Arts - Scream Naughty Dog (PS3)
Multiplayer single-screen kilka kontrolerów podłączonych do jednej maszyny, pojedyncza kamera (np. bijatyki) split-screen j.w. ale z każdym z graczy skojarzona odrębna kamera networked wiele maszyn połączonych w sieć i każda z nich jest hostem dla jednego gracza MMOG tysiące graczy za pośrednictwem swoich maszyn, współdzielą jeden olbrzymi świat obsługiwany przez (zwykle) bardzo dużą liczbę serwerów Przekształcenie gry multiplayerowej do single-playerowej jest zwykle prostym zadaniem. Wiele silników traktuje tryb single jako przypadek szczególny trybu multi (np. Quake). Przekształcenie odwrotne (single -> multi) jest zwykle o wiele bardziej trudne, bowiem należy dostosować od multi wiele modułów silnika (renderer, warstwa I/O, system animowania, ). Dlatego, jeśli silnik ma wspierać multi, to należy go projektować pod tym kątem od samego początku.
Elementy budulcowe gameplaya Gameplay (pojecie ogolne) całość doświadczeń płynących z grania w grę. Określony jest przez sposób interakcji gracza z gra, zasady gry, cele i wyzwania oraz ich osiąganie, scenariusz, etc. Gameplaye można różnie klasyfikowć, np. wzgledem liniowosci rozgrywki (liniowe, nieliniowe), względem zasad gry (DeathMatch, Capture the flag,...), czy bardziej ogólnie względem gatunku (FPS, Hack and slash,...) Mechanika gry - "maszyneria logiczno-fizyczna" definiowana często przy pomocy jęzków skryptowych, leżąca u podłoża gameplaya i za sprawa ktorej jest on urzeczywistniany/realizowany. Tworzą ją m.in.: reguły gry reprezentowane przez system implikacji logicznych; cele gry i warunki logiczne, które należy spełnić aby te cele osiągnięć; powiązania natury logicznej pomiędzy interaktywnymi obiektami w grze i ich reakcje logiczne (np. zmiana stanu jakiegoś atrybutu logicznego) i fizyczne (in-game behaviour - np. uruchomienie zapadni pod wpływem stopy postaci) w wyniku zachodzących w grze zdarzeń.
Moduły wyspecjalizowane Dodatkowe systemy i funkcjonalności, które są wykorzystywane lub nie w zależności od rodzaju (gatunku) gry.
Czy warto implementować własny silnik gry?
Następny wykład: Cykl produkcyjny wytwarzania gry Prototypowanie geometrii levela na przykładzie UDK