Natknąłem się na to pytanie, projektując grę wideo w języku C #.
Jeśli weźmiemy pod uwagę gry takie jak Battlefield lub Call of Duty , setki, a nawet tysiące pocisków lecą w tym samym czasie. Zdarzenia są uruchamiane w sposób ciągły, a z tego, co wiem, pochłania to dużą moc obliczeniową… czy to prawda? Chcę wiedzieć, jak różni twórcy gier zarządzają pociskami (2D i 3D) i jaka jest najbardziej wydajna metoda dla każdego z nich.
Czytam pytanie W jaki sposób pociski są symulowane w grach wideo? ale nie wpływa to na działanie pocisków z perspektywy projektowania programu.
Miałem kilka pomysłów, ale każdy ma swoje wady:
Najbardziej wydajna metoda, o której mogłem pomyśleć (w przypadku gier 2D):
Powiedzmy, że miałem stworzyć klasę o nazwie Bullet, i jak długo użytkownik przytrzymuje przycisk, co 0,01 sekundy powstaje obiekt Bullet. Ten punkt ma:
1 prędkość
2 Pozycja początkowa miejsca, z którego jest strzelany
3 Struktura duszka
4 Efekt przy trafieniu
Ponieważ kula byłaby własną klasą, mogłaby sama zarządzać słuchaczami rysowania, poruszania się i akcji.
Czy procesorowi nie byłoby trudno przetworzyć tysiące takich obiektów, które są tworzone, a następnie niszczone (gdy wyzwalany jest efekt przy trafieniu)? Miejsce w pamięci RAM?
Wydajna metoda gier 3D - Inną myślą, którą miałem, było:
Powiedzmy, że tworzę klasę broni. Ta broń ma różne funkcje, z których niektóre:
1 Wykryj, dokąd celuje broń, i sprawdź, czy patrzy na cel
2 Uruchom animację strzelania z pistoletu
3 Ma metodę doDamage (), która wskazuje coś do odjęcia zdrowia od tego, na co celowana jest broń
4 Powiadamia klasę animacji pocisku po naciśnięciu przycisku
Mógłbym wtedy stworzyć klasę statyczną, powiedzmy BulletAnimation, która mogłaby otrzymać powiadomienie z miejsca, w którym uruchomiła się broń, gdzie jest ona skierowana (do celu pocisku) oraz informacje na temat odpowiedniego duszka i prędkości do użycia dla pocisku . Ta klasa następnie rysuje duszki (może na nowym wątku, idk) na podstawie obu pozycji i pożądanego duszka, aby zasymulować wystrzelenie pocisku z pistoletu.
Ta ostatnia wydaje się o wiele trudniejsza do kodowania i czy nie wymagałoby to dużej mocy obliczeniowej, aby stale wywoływać statyczne, aby zrobić to dla tysięcy pocisków jednocześnie? Trudno byłoby również uzyskać ciągłe aktualizacje pozycji początkowej i końcowej.
Moje pytanie brzmi: jaki jest najbardziej efektywny sposób, w jaki robią to twórcy gier? Czy ta metoda zmienia się z gier 2D na 3D?
pew-pew-pew
technologii :)