290 likes | 500 Views
Programowanie gier komputerowych Tomasz Martyn. Wykład 1. Silnik gry – podstawowe wiadomości. Inżynierowie (informatycy) – projektują i implementują oprogramowanie związane z grą poszczególne moduły silnika (rendering, AI, fizyka, audio, etc.)
E N D
Programowanie gier komputerowychTomasz Martyn Wykład 1. Silnik gry – podstawowe wiadomości
Inżynierowie (informatycy) – projektują i implementują oprogramowanie związane z grą • poszczególne moduły silnika (rendering, AI, fizyka, audio, etc.) • praca na poziomie makro-systemowym (integeracja poszczególnych składowych silnika, etc.) • programowanie gameplaya i skryptowanie W ramach projektu, zespołem inżynierów kieruje senior engineer • Projektanci gameplaya(interaktywnej części gry odpowiedzialnej za wrażenia i doświadczenia gracza ) • scenariusz gry, sekwencja rozdziałów (poziomów), cele gry, dialogi • projekty poziomów (levels) gry - rozmieszczenie geometrii statycznej - rozmieszczenie broni, apteczek, etc. - w którym miejscu i kiedy wyskoczy potwór… Struktura studia deweloperskiego (1)
Artyści – tworzą zawartość (content) gry • szkice i obrazy na poziomie konceptualnym (conceptartists) • modelarze • foregroundmodelers tworzą modele pierwszoplanowe (postaci, pojazdy, …) • backgroundmodelers tworzą statyczną geometrię świata (tereny, budynki…) • projektanci tekstur (textureartists) • oświetleniowcy (lightingartists) • animatorzy • aktorzy motioncapture • muzycy i projektanci efektów dzwiękowych • voiceactors Zespołem artystów kieruje art director Struktura studia deweloperskiego (2)
Testerzy • Producenci – zależnie od studia: • zarządzanie zasobami ludzkimi • łącznik miedzy deweloperami, a działem businessowym studia • czasem nie ma producentów, a czasem wszyscy są producentami 6. Inni • techniczni • administracja • dział marketingu • … Struktura studia deweloperskiego (3)
Podstawowy cel silnika: Wielokrotne wykorzystanie istniejącego kodu do tworzenia różnych gier • Jednakże granica między silnikiem a samą grą jest często rozmyta • Na ogół przyjmuje się, że pojęcie architektura sterowana danymi (data-drivenarchitecture) wytycza granice między grą a jej silnikiem • Recepta na wyodrębnienie silnika z gry: Usuń z gry zasoby (art assets), świat i reguły gry, a to, co zostanie, to będzie silnik Co to jest silnik gry?
Rodzina „quake’owa”(Id software): - Doom - pierwszy silnik z prawdziwego zdarzenia - Quake III Arena - umożliwiał modding Technologia Quake’a została wykorzystana m.in. w grach: - Sin - F.A.K.K. 2 - Medal of Honor : Allied Assault i Pacific Assault • Unreal Engine 1- 3(Epic Games) • Half Life Source Engine • XNA (środowisko wspomagające programowanie gier) • Unity Engine • silniki open source: Ogre, Irrlicht, Troque, Crystal Space… Przykładowe silniki gier
Dzisiejsze, komercyjne silniki gier są dużymi pakietami programowymi, w których można wyodrębnić dwie podstawowe składowe: • silnik właściwy (realtimegameengine) • zbiór rozmaitych narzędziwspomagających tworzenie gry (edytor świata, edytor cząstek, konwertery formatów danych, etc.) Co to jest silnik gry? (cd)
Algorytmy i struktury danych - STL – używać, czy nie używać? • Grafika • libgcm– niskopoziomowe API graficzne Sony dla RSX (PS3) • Edge – wysokopoziomowe, wydajne API graficzne firm Naughty Dog i Sony dla PS3 • Fizyka • Open Dynamics Engine • Animacja postaci • Granny • HavokAnimation • Edge • Endorphini Euphoria(Natural Motion Ltd.) • AI - Kynapse Warstwa zewnętrznych API
Obudowuje (wrapping) lub zastępuje wywołania funkcji systemowych, interfejsy różnych API, a nawet niektóre standardowe funkcje języka C. Warstwa niezależności od platformy
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 (zamiast bibliotek zewnętrznych typu STL) Systemy rdzenia
Podstawowe funkcje: • udostępnia jednolity interfejs (lub grupę interfejsów) do ładowania i usuwania różnego rodzaju zasobów gry (assetsoraz inne dane) • 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 Zarządca zasobów
Zastosowanie: Pobieranie obiektów graficznych i jak najszybsze ich renderowanie (zwykle bez brania pod uwagę, które z nich są 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 – pole widzenia, płaszczyzny obcinania, etc.) oraz widoku (viewport) i tworzy między nimi połączenie • obsługuje system materiałów i system oświetlenia • zarządza stanami renderingu na podstawie materiałów i oświetlenia • grupuje obiekty graficzne (np. względem materiałów) celem minimalizowania zmian stanów renderingu Silnik graficzny (1): Renderer
Zastosowanie: Przeszukuje scenę celem wyznaczania obiektów graficznych, które są aktualnie widoczne (PVS), oraz określa wymagany poziom szczegółowości prezentowanych obiektów (LOD) • selekcja obiektów względem bryły widzenia (frustumculling) • grafy sceny i struktury podziału przestrzennego (BSP tree, quad- i octree, kd-tree, hierarchie brył ograniczających) • portale • selekcja obiektów względem zasłaniania (occlusionculling) • poziom szczegółowości (LOD - level of detail) Silnik graficzny (2): Graf sceny, wstępna selekcja obiektów i LOD
systemy cząstek (dym, ogień, rozbryzgi wody,…) – często jako bezpośrednie wejście dla renderera • kalkomanie (decals - dziury po pociskach, ślady stóp,…) – j.w. • mapowanie oświetlenia i otoczenia • efekty postprocesingu (patrz np. OgreCompositor) • high dynamicrange • antyaliasing • bloom • ... Warstwa efektów
Zastosowanie: Umożliwia tworzenie (często 2-wymiarowych, implementowanych jako teksturowane prostokąty) „nakładek” na wizualizowaną scenę 3D • HUD i GUI (wybór broni, konfigurowanie jednostek, wydawanie rozkazów,…) • różnego rodzaju menu Dodatkowo: • odtwarzanie nagranych wcześniej scenek-przerywników (FMV) • in-gamecinamatics (IGC) – stałe sekwencje wbudowane w rozgrywkę Warstwa interfejsu gracza
konsola i inne narzędzia deweloperskie (dostarczane z grą lub nie) • mierzenie czasu wykonania wybranych części kodu • wyświetlanie statystyk podczas działania gry • wyświetlanie na bieżąco jak dużo pamięci jest używanej przez silnik i jego poszczególne moduły • nagrywanie zdarzeń gry w celu ponownego odtworzenia danej sekwencji • … Profilowanie i debugowanie
Obecnie przy komercyjnym tworzeniu gier zwykle korzysta się z gotowych silników fizycznych: • Havok • PhysX Wykrywanie kolizji i fizyka
Obecnie w grach 3D najczęściej wykorzystywana jest animacja szkieletowa 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) System animowania
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 • … Warstwa I/O
XACT – Microsoft (PC i Xbox 360) • SoundR!OT – ElectronicArts • Scream – Naughty Dog (PS3) System dźwięku
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 na ogół prostym zadaniem. Wiele silników traktuje tryb single jako przypadek szczególny trybu multi (np. Quake). Multiplayer 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.
Zastosowanie: Pośredniczy między kodem rozgrywki (w natywnym języku, w którym napisany jest silnik, lub w języku skryptowym - często w tym i w tym), a niższymi warstwami silnika • high-levelgameflow - definiuje sekwencję, drzewo lub graf celów gracza; dostarcza również definicję „sukcesu” oraz „kary” za porażkę • elementy statyczne świata na ogół podzielone są na kawałki (chunks, levels): • ze względu ograniczeń pamięciowych • w celu sprawowania kontroli nad „przepływem” gry w wirtualnym świecie • w celu ułatwienia procesu tworzenia gry Gracz w danej chwili widzi co najwyżej kilka (zwykle jeden) taki kawałek • elementy dynamiczne są tym, co w największej mierze określa rozgrywkę Warstwa „fundamentów rozgrywki”