Spis treści
Podziękowania (15)
O obrazku z okładki (16)
Biografie Autorów (17)
Przedmowa (31)
Część I Programowanie ogólne (35)
Wprowadzenie (37)
Rozdział 1.1 Optymalizacja kodu w języku C++ w grach (39)
- Konstrukcja i destrukcja obiektu (39)
- Zarządzanie pamięcią (42)
- Funkcje wirtualne (43)
- Rozmiar kodu (45)
- Biblioteka STL (45)
- Zaawansowane funkcje (47)
- Dodatkowa lektura (48)
Rozdział 1.2 Rozwijanie funkcji w miejscu wywołania kontra makra (49)
- Zalety funkcji inline (49)
- Kiedy należy używać funkcji inline (51)
- Kiedy należy używać makr (51)
- Dodatki w kompilatorze Microsoftu (52)
- Bibliografia (52)
Rozdział 1.3 Programowanie z wykorzystaniem abstrakcyjnych interfejsów (53)
- Abstrakcyjny interfejs (53)
- Dodawanie fabryki (55)
- Abstrakcyjne klasy jako zbiory cech (56)
- Wszystko ma swoją cenę (59)
- Wnioski (59)
- Bibliografia (60)
Rozdział 1.4 Eksport klas C++ z bibliotek DLL (61)
- Eksport funkcji (61)
- Eksport klasy (61)
- Eksport funkcji członkowskich klasy (63)
- Eksport funkcji wirtualnych klasy (63)
- Podsumowanie (64)
Rozdział 1.5 Zabezpiecz się przed piekłem bibliotek DLL i brakujących funkcji systemu operacyjnego (65)
- Łączenie jawne i niejawne (66)
- Funkcje LoadLibrary i GetProcAddress (66)
- Obrona przed błędnymi bibliotekami DirectX (67)
- Funkcje specyficzne dla systemu operacyjnego (68)
- Podsumowanie (69)
Rozdział 1.6 Dynamiczna informacja o typie (71)
- Wprowadzenie do klasy dynamicznej informacji o typie (71)
- Demaskowanie typu i odpytywanie DTI (72)
- Dziedziczenie oznacza "jest typu" (73)
- Obsługa ogólnych obiektów (74)
- Implementacja trwałej informacji o typie (75)
- Zastosowanie trwałej informacji o typie w bazie danych zapisów stanu gry (77)
- Wnioski (77)
- Bibliografia (78)
Rozdział 1.7 Klasa właściwości umożliwiająca ogólny dostęp do członków klas C++ (79)
- Kod (80)
- Inne możliwe wykorzystania klas (82)
- Bibliografia (83)
Rozdział 1.8 Fabryka jednostek w grze (85)
- Komponenty (86)
- Klasy waga piórkowa, zachowań i eksportowa (86)
- Obiekty wagi piórkowej (86)
- SAMM-y, gdzie jesteś? (87)
- Hierarchia klas zachowań (88)
- Wykorzystanie wzorca szablonu metod w przypisywaniu zachowań (89)
- Klasy eksportowe (90)
- Fabryka jednostek (91)
- Wybór strategii w trakcie działania programu (92)
- Uwagi końcowe (94)
- Bibliografia (94)
Rozdział 1.9 Dodawanie klasy informującej o niezalecanych funkcjach w C++ (95)
- Możliwe rozwiązania (95)
- Idealne rozwiązanie (96)
- Używanie i przypisywanie niezalecanych funkcji (96)
- Implementacja niezalecania funkcji w C++ (97)
- Co można poprawić? (98)
- Podziękowania (98)
- Bibliografia (98)
Rozdział 1.10 Menedżer pamięci pomocny przy testowaniu gry (99)
- Zaczynamy (99)
- Rejestracja informacji w menedżerze (100)
- Raportowanie zebranych informacji (102)
- O czym należy pamiętać (104)
- Możliwe rozszerzenia (105)
- Bibliografia (105)
Rozdział 1.11 Moduł profilujący wbudowany w grę (107)
- Podstawy profilowania programów (107)
- Komercyjne narzędzia (108)
- Czemu utworzyć własny system? (109)
- Wymagania dotyczące modułu profilującego (109)
- Architektura i implementacja (110)
- Szczegóły implementacji (111)
- Analiza danych (111)
- Uwagi dotyczące implementacji (112)
Rozdział 1.12 Model programowania liniowego w grach w systemie Windows (113)
- Aktualizacja świata (113)
- Rozwiązanie - wielowątkowość (114)
- Bibliografia (117)
Rozdział 1.13 Nawijanie stosu (119)
- Prosty tymczasowy powrót (119)
- Łańcuchy tymczasowych powrotów (120)
- Thunking (122)
- Rekurencja (123)
Rozdział 1.14 Samomodyfikujący się kod (125)
- Zasady kodu RAM (125)
- Szybkie przekształcanie i kopiowanie bitów (126)
Rozdział 1.15 Zarządzanie plikami z wykorzystaniem plików zasobów (133)
- Czym jest plik zasobów? (133)
- Projekt (134)
- Implementacja (135)
- Ostatnie słowa na temat implementacji (137)
- Wnioski (137)
- Bibliografia (137)
Rozdział 1.16 Odtwarzanie i rejestrowanie wejść gry (139)
- Do czego może się przydać rejestracja wejść? (139)
- Ile to zajmie? (141)
- Testowanie rejestracji wejścia (145)
- Wnioski (145)
- Bibliografia (145)
Rozdział 1.17 Elastyczny system analizy składniowej tekstu (147)
- System analizy składniowej (148)
- Makra, nagłówki i magia wcześniejszego przetwarzania (148)
- Wyjaśnienie systemu analizy składniowej (149)
- Klasa TokenFile (152)
- Uwagi końcowe (153)
Rozdział 1.18 Interfejs uniwersalnego modyfikatora wartości zmiennych (155)
- Analiza wymagań (155)
- Implementacja (156)
- Użycie (160)
- Uwagi (162)
- Podziękowania (162)
Rozdział 1.19 Generacja rzeczywiście losowych liczb (163)
- Pseudolosowość (163)
- Rzeczywista losowość (164)
- Źródła losowych wartości (164)
- Źródła sprzętowe (165)
- Funkcja mieszająca (165)
- Ograniczenia (166)
- Implementacja (166)
- Jak losowe wartości uzyskujemy z GenRand? (167)
- Bibliografia (168)
Rozdział 1.20 Wykorzystanie filtrów Blooma do poprawienia wydajności obliczeniowej (169)
- Sposób Blooma (169)
- Możliwe zastosowania (170)
- Jak to działa? (170)
- Definicje (170)
- Pierwszy przykład (171)
- Drugi przykład (175)
- Uwagi końcowe (175)
- Wnioski (176)
- Bibliografia (176)
Rozdział 1.21 Moduł eksportujący postacie z programu 3D Studio MAX i narzędzia dotyczące animacji (177)
- Eksport (178)
- Bibliografia (187)
Rozdział 1.22 Wykorzystanie kamer internetowych w grach wideo (189)
- Inicjalizacja okna przechwytywania danych z kamery (189)
- Manipulacja danymi z kamery (194)
- Wnioski (197)
- Bibliografia (198)
Część II Matematyka (199)
Wprowadzenie (201)
Rozdział 2.1 Sztuczki z liczbami zmiennoprzecinkowymi - poprawa wydajności w standardzie IEEE (203)
- Wprowadzenie (203)
- Format IEEE liczb zmiennoprzecinkowych (204)
- Sztuczki liczb zmiennoprzecinkowych (205)
- Liniowa tablica przeglądowa dla funkcji sinus i kosinus (210)
- Optymalizacja logarytmiczna pierwiastka kwadratowego (212)
- Optymalizacja dowolnych funkcji (213)
- Mierzenie wydajności (216)
- Wnioski (217)
- Bibliografia (217)
Rozdział 2.2 Sztuczki z wektorami i płaszczyznami (219)
- Wysokość względem płaszczyzny kolizji (219)
- Szukanie punktu kolizji (220)
- Odległość do punktu zderzenia (221)
- Odbicie od płaszczyzny kolizji (222)
- Zderzenia z tłumieniem (225)
- Interpolacja w poprzek linii lub płaszczyzny (225)
Rozdział 2.3 Szybkie i elastyczne przecinanie trójwymiarowych linii (227)
- Co czyni ten algorytm elastycznym? (228)
- Sformułowanie problemu (228)
- Wyprowadzenie równań zwięzłego rozwiązania (230)
- Obsługa odcinków (236)
- Opis implementacji (239)
- Możliwości optymalizacji (239)
- Wnioski (240)
- Bibliografia (240)
Rozdział 2.4 Określanie odwrotnej trajektorii (241)
- Szczególne przypadki (243)
- Optymalizacja implementacji (248)
- Podsumowanie (249)
Rozdział 2.5 Ramka transportu równoległego (251)
- Metoda (252)
- Wnioski (255)
- Bibliografia (255)
Rozdział 2.6 Gładkie ścieżki C2 bazujące na kwaternionach (257)
- Wprowadzenie (257)
- Interpolacja położenia (258)
- Interpolacja obrotu (259)
- Kierunek obrotu i selektywna negacja (260)
- Interpolacja krzywymi sklejanymi dla kwaternionów (261)
- Osobliwości w wymiernym przekształceniu (262)
- Cięcia kamery (262)
- Kod (263)
- Bibliografia (263)
Rozdział 2.7 Rekurencyjne grupowanie wymiarami - szybki algorytm detekcji zderzeń (265)
- Inne zastosowania (266)
- Słaby punkt algorytmu (270)
- Znajdowanie par będących w kolizji (271)
- Złożoność czasowa (273)
- Wnioski (274)
- Bibliografia (274)
Rozdział 2.8 Programowanie fraktali (275)
- Fraktal plazmowy (276)
- Fraktal błędny (276)
- Fraktal ruchu Browna (277)
- Implementacja (278)
- Wykorzystanie FBM (281)
- Bibliografia (282)
Część III Sztuczna inteligencja (283)
Wprowadzenie (285)
Rozdział 3.1 Strategie optymalizacji sztucznej inteligencji (287)
- Strategia 1.: Używaj zachowania sterowanego zdarzeniami, a nie odpytywania (287)
- Strategia 2.: Redukuj niepotrzebne obliczenia (288)
- Strategia 3.: Centralizuj współdziałanie za pomocą zarządców (289)
- Strategia 4.: Rzadziej uruchamiaj sztuczną inteligencję (289)
- Strategia 5.: Rozłóż przetwarzanie na kilka klatek (290)
- Strategia 6.: Wprowadź poziomy szczegółowości sztucznej inteligencji (290)
- Strategia 7.: Rozwiązuj tylko część zagadnienia (291)
- Strategia 8.: Najcięższą pracę wykonuj poza pętlą czasu rzeczywistego (291)
- Strategia 9.: Używaj pojawiających się zachowań, by unikać skryptów (292)
- Strategia 10.: Amortyzuj koszty odpytywań za pomocą ciągłego księgowania (292)
- Strategia 11.: Jeszcze raz przeanalizuj problem (293)
- Wnioski (293)
- Bibliografia (294)
Rozdział 3.2 Mikrowątki sztucznej inteligencji obiektu gry (295)
- Prostszy sposób (297)
- Mikrowątki (297)
- Zarządzanie stosem (299)
- Problemy (300)
- Wniosek (301)
- Bibliografia (301)
Rozdział 3.3 Zarządzanie sztuczną inteligencją za pomocą mikrowątków (303)
- Kawałek po kawałku (303)
- Dobre zachowanie (304)
- Wszystko jest w umyśle (305)
- Problemy (307)
- Wnioski (309)
- Bibliografia (310)
Rozdział 3.4 Architektura kolejkowania poleceń w grach RTS (311)
- Polecenia gier RTS (311)
- Kolejkowanie poleceń (312)
- Polecenia cykliczne (313)
- Wnioski (316)
- Bibliografia (316)
Rozdział 3.5 Wysokowydajny system widoczności i wyszukiwania oparty na siatkach (317)
- Ogólne przedstawienie zagadnienia (317)
- Definicje (318)
- Komponent 1.: Mapy widoczności dla poszczególnych graczy (319)
- Komponent 2.: Szablony linii widoczności (319)
- Komponent 3.: Połączona mapa widoczności (321)
- Usprawnione wyszukiwanie (322)
- Wnioski (324)
Rozdział 3.6 Mapy wpływu (325)
- Mapy wpływu (325)
- Prosta mapa wpływu (326)
- Dane komórki mapy wpływu (327)
- Obliczanie potrzebnych wartości (328)
- Określanie optymalnego rozmiaru komórki (330)
- Rozchodzenie się wpływów (330)
- Branie pod uwagę kształtu terenu (331)
- Szczególne okoliczności (333)
- Odświeżanie mapy wpływu (333)
- Mapy wpływu w trójwymiarowych środowiskach (334)
- Bibliografia (335)
Rozdział 3.7 Techniki oceny strategicznej (337)
- Drzewo przydziału zasobów (337)
- Obliczanie pożądanego przydziału (339)
- Określanie aktualnego przydziału (339)
- Podejmowanie strategicznych decyzji (340)
- Miary wartości (341)
- Graf zależności (341)
- Węzły grafu zależności (342)
- Ekonomiczne planowanie (342)
- Znajdowanie czułych zależności (343)
- Wnioskowanie strategiczne (343)
- Osobowość postaci (344)
- Łączymy wszystko razem (345)
- Bibliografia (345)
Rozdział 3.8 Analiza terenu w trójwymiarowych grach akcji (347)
- Reprezentacja terenu, która pozwoli go zrozumieć i przeanalizować (348)
- Punkty kontrolne (348)
- Przykładowy teren i potrzeby sztucznej inteligencji (349)
- Analiza taktyczna (349)
- Od wartości taktycznych do właściwości punktów kontrolnych (350)
- Obliczanie właściwości punktów kontrolnych (351)
- Wiedza płynąca z doświadczenia zdobywanego w trakcie gry (354)
- Umieszczanie analizy terenu w grze (354)
- Inne zastosowania (355)
- Wnioski (356)
- Bibliografia (356)
Rozdział 3.9 Rozszerzona geometria dla znajdowania drogi metodą punktów widzialności (357)
- Definiowanie modelu zderzeń (358)
- Znajdowanie drogi między wielokątami (358)
- Rozszerzaj i zwyciężaj (359)
- Suma Minkowskiego dla wypukłych wielokątów (359)
- Rozszerzanie niewypukłej geometrii (361)
- Dobór kształtu zderzenia (362)
- Wnioski (363)
- Bibliografia (363)
Rozdział 3.10 Optymalizacja znajdowania drogi metodą punktów widoczności (365)
- Znajdowanie drogi za pomocą punktów widoczności (366)
- Przechowywanie najkrótszej ścieżki do każdego punktu (366)
- Łączenie narożników (367)
- Optymalizacja 2.: Rozważaj tylko ścieżki idące wokół narożników (368)
- Strefy zarysu (368)
- Używanie stref zarysu z podziałem przestrzeni (370)
- Wnioski (370)
- Bibliografia (371)
Rozdział 3.11 Stada z zębami: drapieżnicy i ofiary (373)
- Całkowicie nowy świat (374)
- Stada z zębami (377)
- Ograniczenia i możliwe rozszerzenia (377)
- Bibliografia (378)
Rozdział 3.12 Ogólny automat stanów rozmytych w języku C++ (379)
- Dlaczego warto używać FuSM w grach? (380)
- Jak używać FuSM w grze? (381)
- Krótkie wprowadzenie do ogólnego automatu stanów skończonych z pierwszego tomu (381)
- Dostosowywanie oryginalnego automatu do FuSM w C++ (382)
- Teraz dodaj logikę rozmytą do własnych gier! (383)
- Bibliografia (383)
Rozdział 3.13 Zmniejszanie eksplozji kombinacji w systemach rozmytych (385)
- Problem (385)
- Rozwiązanie (386)
- Konkretny przykład (388)
- Konkretny przykład w metodzie Combsa (390)
- Wnioski (392)
- Bibliografia (392)
Rozdział 3.14 Używanie sieci neuronowych w grach - konkretny przykład (393)
- Gra (393)
- Wielowarstwowy perceptron (394)
- Dobór wejść (395)
- Zbieranie danych (396)
- Trenowanie MLP (397)
- Wyniki (398)
- Wnioski (399)
- Bibliografia (399)
Część IV Zarządzanie geometrią (401)
Wprowadzenie (403)
Rozdział 4.1 Porównanie metod VIMP (405)
- Czynniki (405)
- "Czysta" metoda VIMP (407)
- Paski pomijane (410)
- Wielopoziomowe paski pomijane (411)
- Tryb mieszany VIMP (413)
- Tryb mieszany pasków pomijanych (414)
- Przesuwane okno (414)
- Podsumowanie (418)
- Bibliografia (418)
Rozdział 4.2 Upraszczanie terenu za pomocą zazębiania kratek (419)
- Zabawa z kratkami (420)
- Tworzenie mapy (421)
- Szablony kratek (422)
- Brzydko, brzydko, brzydko (422)
- Lepiej, szybciej, silniej (424)
- Wnioski (424)
- Bibliografia (425)
Rozdział 4.3 Drzewa kul dla szybkiego określania widoczności, raytrackingu i wyszukiwania zakresowego (427)
- Kule otaczające (427)
- Używanie drzew kul (428)
- Przykładowa aplikacja (429)
Rozdział 4.4 Skompresowane drzewa sześcianów otaczających równoległych do osi (431)
- Krótki przegląd sposobów hierarchicznego sortowania (431)
- Drzewa AABB (432)
- Tworzenie drzew AABB (433)
- Kompresja drzew AABB (433)
- Aproksymacja wymiarów (434)
- Wykorzystywanie rekurencji (435)
- Wydajność w trakcie działania (435)
- Dalsze rozszerzenia (436)
- Bibliografia (436)
Rozdział 4.5 Przeszukiwanie drzewa czwórkowego o bezpośrednim dostępie (437)
- Gdzie idzie wydajność (438)
- Usuwanie pośredników (439)
- Warunki i wymagania (439)
- Określanie poziomu drzewa (440)
- Dostosowywanie do sytuacji (442)
- Określanie położenia (443)
- Przemieszczanie się po drzewie czwórkowym (444)
- Dostosowywanie drzewa czwórkowego (444)
Rozdział 4.6 Aproksymacja załamań w akwariach (445)
- Obserwacja akwarium (445)
- Poprawa realizmu (448)
- Wniosek (448)
Rozdział 4.7 Renderowanie zrzutów ekranowych o rozdzielczości nadającej się do druku (449)
- Podstawowy algorytm (450)
- Uwagi i ewentualne problemy (452)
- Zakończenie (452)
- Bibliografia (452)
Rozdział 4.8 Stosowanie śladów dla dowolnych powierzchni (453)
- Algorytm (453)
- Przycinanie trójkątów (455)
- Implementacja (456)
- Bibliografia (456)
Rozdział 4.9 Rendering odległej scenerii jako tło (459)
- Podstawowa metoda (459)
- Rozdzielczość tła (459)
- Rozmiar sześcianu tła (460)
- Rendering sceny (461)
- Sześcienne mapowanie środowiska (461)
- Tworzenie tekstur tła (462)
- Wniosek (462)
- Kod źródłowy (462)
Rozdział 4.10 Postacie rzucające na siebie cień (463)
- Wcześniejsze metody (463)
- Podział geometrii postaci (463)
- Rendering tekstury (464)
- Rendering postaci (464)
- Wniosek (465)
- Bibliografia (465)
Rozdział 4.11 Sterowanie i animacja z pozycji trzeciej osoby w grze Super Mario 64 (467)
- Ustawienia (467)
- Konwersja wejścia kontrolera (468)
- Obrót postaci (469)
- Przesuwanie postaci (470)
- Animacja postaci (471)
- Analiza animacji Super Mario 64 (473)
- Wniosek (474)
- Bibliografia (474)
Część V Wyświetlanie grafiki (475)
Wprowadzenie (477)
Rozdział 5.1 Rendering kreskówek - wykrywanie i rendering krawędzi sylwetki w czasie rzeczywistym (479)
- Twórca zarysów (479)
- Ważne krawędzie (480)
- Metody wykrywania krawędzi sylwetki (481)
- Wyciąganie rysunku w tuszu bazujące na krawędziach (481)
- Wyciąganie rysunku w tuszu za pomocą programowanego shadera wierzchołków (483)
- Wyciąganie rysunku w tuszu za pomocą zaawansowanych funkcji tekstur (485)
- Wniosek (486)
- Bibliografia (486)
Rozdział 5.2 Rendering kreskówek za pomocą mapowania tekstur i programowanych shaderów wierzchołków (487)
- Cieniowanie w kreskówkach (487)
- Malowanie (488)
- Programowane shadery wierzchołków (491)
- Wniosek (493)
- Bibliografia (493)
Rozdział 5.3 Metody dynamicznego oświetlenia dla pikseli (495)
- Trójwymiarowe tekstury w dynamicznym oświetlaniu (495)
- Mapowanie nierówności dot3 (498)
- Normalizacja za pomocą map sześciennych (501)
- Światła stożkowe bazujące na pikselach (502)
- Bibliografia (503)
Rozdział 5.4 Tworzenie proceduralnych chmur za pomocą kart graficznych z akceleracją 3D (505)
- Właściwości chmur (505)
- Generator liczb losowych (506)
- Animacja oktawy szumu (508)
- Mapowanie na geometrię nieba (511)
- Dodatkowe funkcje (511)
- Ograniczenia sprzętowe (512)
- Uzyskiwanie większej uniwersalności (513)
- Wnioski (513)
- Bibliografia (514)
Rozdział 5.5 Maskowanie tekstur w celu przyspieszenia rysowania efektu soczewki (515)
- Zasłanianie efektu soczewki (515)
- Problemy sprzętowe (516)
- Maskowanie tekstur (518)
- Uwagi co do wydajności (519)
- Usprawnienia (520)
- Przykładowy kod (520)
- Alternatywne podejścia (521)
- Bibliografia (521)
Rozdział 5.6 Praktyczne cienie oparte na buforach priorytetowych (523)
- Porównanie buforów priorytetowych z buforami głębi (525)
- Rozwiązywanie problemów z aliasingiem (526)
- Metody hybrydowe (528)
- Podsumowanie (529)
- Bibliografia (529)
Rozdział 5.7 Oszuści - dodawanie śmieci (531)
- Cały proces (532)
- Rendering oszusta (532)
- Heurystyka aktualizacji (536)
- Wydajność (538)
- Przewidywanie (538)
- Podsumowanie (539)
Rozdział 5.8 Działania w sprzęcie pozwalające na proceduralną animację tekstur (541)
- Operacje sprzętowe (542)
- Dalsza praca (551)
- Podziękowania (552)
- Przykładowy kod (552)
- Bibliografia (552)
Część VI Programowanie dźwięku (553)
Wprowadzenie (555)
Rozdział 6.1 Wzorce projektowe w programowaniu dźwięku w grach (557)
- Most (557)
- Fasada (558)
- Złożenie (559)
- Pośrednik (559)
- Dekorator (560)
- Polecenie (560)
- Pamiątka (561)
- Obserwator (561)
- Wielka kula błota (zwana także kodem spaghetti) (562)
- Wniosek (563)
- Bibliografia (563)
Rozdział 6.2 Metoda natychmiastowego ponownego użycia głosów w syntezatorze bazującym na próbkach (565)
- Problem (565)
- Pomysł na rozwiązanie (566)
- Rozwiązanie (567)
- Wniosek (568)
Rozdział 6.3 Programowe efekty DSP (569)
- Filtrowanie (569)
- Splot (570)
- Opóźnienie (571)
- Interpolacja (572)
- Bibliografia (572)
Rozdział 6.4 Interaktywny potok przetwarzania w cyfrowym dźwięku (575)
- Wprowadzenie (575)
- Dyskusja (578)
- Kod (580)
- Dodatkowy komentarz (583)
- Wniosek (584)
Rozdział 6.5 Prosty sekwenser muzyki dla gier (585)
- Strumieniowanie kontra sekwencjonowanie (585)
- Podstawowe koncepcje komputerowej muzyki (586)
- Implementacja komputerowego sekwensera muzyki (589)
- Sterowanie syntezą dźwięku (596)
- Kod (596)
- Wnioski (596)
- Bibliografia (596)
Rozdział 6.6 Sekwenser interaktywnej muzyki dla gier (597)
- Powiązania muzyczne (597)
- Znaczenie muzyki (598)
- Przejścia (598)
- Rodzaje przejść (598)
- Czułość sterowania (601)
- Sterowanie docelowe (601)
- Przykłady projektów (602)
- Kod (604)
- Wniosek (604)
- Bibliografia (605)
Rozdział 6.7 Interfejs programistyczny niskiego poziomu dla dźwięku (607)
Dodatki (609)
Skorowidz (611)