
Jeśli zajmujesz się lub zamierzasz się zająć programowaniem gier komputerowych, nie odkładaj tej książki na półkę. Znajdziesz w niej siedemdziesiąt rozwiązań rozmaitych problemów, przed którymi staje programista gier. Są to rozwiązania do natychmiastowego zastosowania lub pomysły, które mogą znacznie zredukować nakład pracy. Ich autorami są najwybitniejsi autorzy gier, współtwórcy wielu prawdziwych hitów. Dość powiedzieć, że redaktorami książki "Perełki programowania gier" są pracownicy firm takich jak Nintendo czy NVidia Corporation.Autorzy postarali się, by przedstawiane przez nich perełki ukazywały praktyczne techniki programistyczne, możliwe do osiągnięcia przy użyciu aktualnie stosowanych technologii i pomagające przy pisaniu gier komputerowych. Przykładowe kody źródłowe opierają się na uznanych standardach: językach C i C++, interfejsy OpenGL i DirectX i nieodzownym, gdy chcemy uzyskać maksymalną wydajność asemblerze procesorów x86.
Porady i rozwiązania podzielone są na 6 części:
- Programowanie ogólne (projektowanie systemów testowych, wykorzystanie profilowania, rodzaje baz danych, biblioteki narzędzi, procedury obsługi zrzucania stosu, narzędzia dzienników zdarzeń, samomodyfikujący się kod)
- Matematyka (sztuczki z liczbami zmiennoprzecinkowymi w formacie IEEE, szybka interpolacja kwaternionowa, szybkie grupowanie przestrzeni, fraktale, fizyka, sztuczki z wektorami i płaszczyznami, rozwiązywanie przecięć krawędź-krawędź, algorytmy ruchu po krzywej)
- Sztuczna inteligencja (znajdowanie drogi, ocena strategiczna, mapy wpływu, systemy wyszukiwania i widoczności, automaty stanów rozmytych, ocena terenu, mikrowątki)
- Zarządzanie geometrią (zarządzanie całością geometrii, algorytmy poziomów szczegółowości, skompresowane drzewa prostopadłościanów otaczających wyrównywanych do osi, metody drzew czwórkowych, drzewa kul dla określania widoczności, śledzenie promieni, przeszukiwanie zakresowe, tworzenie teł na sześcianach, postacie rzucające cień na siebie, stosowanie plam na dowolnych powierzchniach)
- Grafika (metody renderingu, tworzenie proceduralnych chmur, maskowanie tekstur, metody dynamicznego oświetlania opartego na pikselach, mapowanie tekstur, programowalne shadery wierzchołków)
- Programowanie dźwięku (wzorce projektowe w programowaniu dźwięku, metody ponownego użycia głosów i prosty sekwenser muzyki bazujący na próbkach, programowe efekty DSP, interfejs programistyczny niskiego poziomu dla dźwięku)
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)
- 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)
- Abstrakcyjny interfejs (53)
- Dodawanie fabryki (55)
- Abstrakcyjne klasy jako zbiory cech (56)
- Wszystko ma swoją cenę (59)
- Wnioski (59)
- Bibliografia (60)
- Eksport funkcji (61)
- Eksport klasy (61)
- Eksport funkcji członkowskich klasy (63)
- Eksport funkcji wirtualnych klasy (63)
- Podsumowanie (64)
- Łą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)
- 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)
- Kod (80)
- Inne możliwe wykorzystania klas (82)
- Bibliografia (83)
- 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)
- 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)
- 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)
- 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)
- Aktualizacja świata (113)
- Rozwiązanie - wielowątkowość (114)
- Bibliografia (117)
- Prosty tymczasowy powrót (119)
- Łańcuchy tymczasowych powrotów (120)
- Thunking (122)
- Rekurencja (123)
- Zasady kodu RAM (125)
- Szybkie przekształcanie i kopiowanie bitów (126)
- Czym jest plik zasobów? (133)
- Projekt (134)
- Implementacja (135)
- Ostatnie słowa na temat implementacji (137)
- Wnioski (137)
- Bibliografia (137)
- Do czego może się przydać rejestracja wejść? (139)
- Ile to zajmie? (141)
- Testowanie rejestracji wejścia (145)
- Wnioski (145)
- Bibliografia (145)
- 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)
- Analiza wymagań (155)
- Implementacja (156)
- Użycie (160)
- Uwagi (162)
- Podziękowania (162)
- 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)
- 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)
- Eksport (178)
- Bibliografia (187)
- Inicjalizacja okna przechwytywania danych z kamery (189)
- Manipulacja danymi z kamery (194)
- Wnioski (197)
- Bibliografia (198)
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)
- 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)
- 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)
- Szczególne przypadki (243)
- Optymalizacja implementacji (248)
- Podsumowanie (249)
- Metoda (252)
- Wnioski (255)
- Bibliografia (255)
- 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)
- 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)
- Fraktal plazmowy (276)
- Fraktal błędny (276)
- Fraktal ruchu Browna (277)
- Implementacja (278)
- Wykorzystanie FBM (281)
- Bibliografia (282)
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)
- Prostszy sposób (297)
- Mikrowątki (297)
- Zarządzanie stosem (299)
- Problemy (300)
- Wniosek (301)
- Bibliografia (301)
- Kawałek po kawałku (303)
- Dobre zachowanie (304)
- Wszystko jest w umyśle (305)
- Problemy (307)
- Wnioski (309)
- Bibliografia (310)
- Polecenia gier RTS (311)
- Kolejkowanie poleceń (312)
- Polecenia cykliczne (313)
- Wnioski (316)
- Bibliografia (316)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- Całkowicie nowy świat (374)
- Stada z zębami (377)
- Ograniczenia i możliwe rozszerzenia (377)
- Bibliografia (378)
- 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)
- Problem (385)
- Rozwiązanie (386)
- Konkretny przykład (388)
- Konkretny przykład w metodzie Combsa (390)
- Wnioski (392)
- Bibliografia (392)
- Gra (393)
- Wielowarstwowy perceptron (394)
- Dobór wejść (395)
- Zbieranie danych (396)
- Trenowanie MLP (397)
- Wyniki (398)
- Wnioski (399)
- Bibliografia (399)
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)
- Zabawa z kratkami (420)
- Tworzenie mapy (421)
- Szablony kratek (422)
- Brzydko, brzydko, brzydko (422)
- Lepiej, szybciej, silniej (424)
- Wnioski (424)
- Bibliografia (425)
- Kule otaczające (427)
- Używanie drzew kul (428)
- Przykładowa aplikacja (429)
- 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)
- 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)
- Obserwacja akwarium (445)
- Poprawa realizmu (448)
- Wniosek (448)
- Podstawowy algorytm (450)
- Uwagi i ewentualne problemy (452)
- Zakończenie (452)
- Bibliografia (452)
- Algorytm (453)
- Przycinanie trójkątów (455)
- Implementacja (456)
- Bibliografia (456)
- 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)
- Wcześniejsze metody (463)
- Podział geometrii postaci (463)
- Rendering tekstury (464)
- Rendering postaci (464)
- Wniosek (465)
- Bibliografia (465)
- 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)
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)
- Cieniowanie w kreskówkach (487)
- Malowanie (488)
- Programowane shadery wierzchołków (491)
- Wniosek (493)
- Bibliografia (493)
- 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)
- 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)
- 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)
- Porównanie buforów priorytetowych z buforami głębi (525)
- Rozwiązywanie problemów z aliasingiem (526)
- Metody hybrydowe (528)
- Podsumowanie (529)
- Bibliografia (529)
- Cały proces (532)
- Rendering oszusta (532)
- Heurystyka aktualizacji (536)
- Wydajność (538)
- Przewidywanie (538)
- Podsumowanie (539)
- Operacje sprzętowe (542)
- Dalsza praca (551)
- Podziękowania (552)
- Przykładowy kod (552)
- Bibliografia (552)
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)
- Problem (565)
- Pomysł na rozwiązanie (566)
- Rozwiązanie (567)
- Wniosek (568)
- Filtrowanie (569)
- Splot (570)
- Opóźnienie (571)
- Interpolacja (572)
- Bibliografia (572)
- Wprowadzenie (575)
- Dyskusja (578)
- Kod (580)
- Dodatkowy komentarz (583)
- Wniosek (584)
- 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)
- 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)
- Podstawowe klasy (607)
Skorowidz (611)