Pisanie silnika gry od zera za pomocą OpenGL [zamknięte]

15

Chcę zacząć pisać silnik gry od zera w celu uczenia się, jakie są warunki wstępne i jak to zrobić, jakie języki programowania i rzeczy, które mi polecasz? Również, jeśli masz dobre artykuły i książki na ten temat, będzie świetnie. Z góry dziękuję!

Moje języki programowania i narzędzia to:

  • C / C ++ czy dobrze jest używać tylko C?
  • Pyton
  • OpenGL
  • Git
  • GDB

Czego chcę się z tego nauczyć:

  • Podstawowy silnik gry
  • Renderowanie / grafika
  • Gra / Zasady
  • Wejście (klawiatura / mysz / kontrolery itp.)

W renderowaniu / grafice:

  • 3D
  • Zacienienie
  • Oświetlenie
  • Teksturowanie
Wazery
źródło
Dwie kwestie: pytanie to, jak jest, jest zbyt szerokie. Jakie funkcje chcesz, jakie platformy chcesz wspierać, jakie paradygmaty chcesz zbadać, ile odpowiedzialności chcesz włożyć w język skryptowy (jeśli istnieje) i całą masę innych rzeczy, które ja ” Nie zamierzam zawracać sobie głowy dalszą listą.
Tetrad
8
Po drugie: panuje powszechna mądrość, że inni wyrzucą z siebie, że nie powinieneś skupiać się na tworzeniu silnika bez gry. Silnik bez gry oznacza, że ​​nie możesz udowodnić, że silnik jest użyteczny . Dobre silniki wymagają od ludzi spożywania własnej karmy dla psów. Powszechnie-linkowane bloga wchodząc więcej tego argumentu jest tutaj: scientificninja.com/blog/write-games-not-engines
tetradê
2
^ Nie tylko to, ale napisanie silnika bez gry, aby zmotywować wymagania dotyczące funkcji, powoduje pełzanie funkcji i zły interfejs API. Dopóki nie dowiesz się, czego potrzebujesz, na co wskazują wymagania gry, możesz nie umieszczać użytecznych rzeczy w swoim silniku. Z tego samego powodu, jeśli nie musiałeś używać silnika do programowania, możesz uznać, że niektóre z twoich decyzji są naprawdę niezgrabne.
ChrisE
1
Nie widzę sensu w twoich ofertach. Fakt, że znasz C / C ++ i Python, pomaga nam, ale po co wymieniać kontrolę wersji i debugger?
Kaczka komunistyczna
2
@TheCommunistDuck: Hej, to lepsze niż niektórzy programiści. :)
ChrisE

Odpowiedzi:

11

Możesz napisać silnik gry praktycznie w dowolnym języku, używając praktycznie dowolnych metod renderowania. Możesz napisać silnik gry w bash, używając na przykład danych wyjściowych konsoli.

Myślę więc, że najlepiej byłoby określić, czego dokładnie chcesz się nauczyć, pisząc własny silnik. W tworzeniu gier istnieje wiele „pól”.

  • Podstawowy silnik gry

  • Renderowanie / grafika

  • AI

  • Networking

  • Gra / Zasady

  • Dźwięk

  • Wejście (klawiatura / mysz / kontrolery itp.)

itp .. Stamtąd możesz nawet mieć podtematy. W renderowaniu / grafice

  • 2d czy 3d?

  • Modelowanie

  • Zacienienie

  • Oświetlenie

  • Teksturowanie

  • GUI / Huds / Interfejsy.

  • itd itd

Tylko jeden z tych podtematów może zająć wiele godzin (lub lat!) Nauki!

Najpierw zdefiniuj, czego chcesz się nauczyć. Zacznij prosto.

Używaj dowolnego języka, w którym czujesz się komfortowo - choć niektóre lepiej nadają się do niektórych zadań. Na przykład silnik główny i rendering najlepiej wykonać najlepiej przy użyciu języka „niższego” poziomu, takiego jak C / C ++ (jeśli potrzebujesz takiej wydajności); ale coś takiego jak AI lub zasady gry można lepiej wykonać w języku wyższego poziomu. Nic nie mówi, że nie można mieszać i łączyć. Możesz napisać silnik w C ++, renderować w C (ponieważ działa dobrze z OpenGL), a następnie użyć LUA do skryptu reguł gry itp.

Na przykład istnieje silnik gry o nazwie Slick2D. Jest napisany w Javie i jest open source. Jest to przykład prostego silnika 2D napisanego i zaprojektowanego naprawdę dobrze. Możesz nauczyć się podstawowych pojęć, takich jak pętle gier, zarządzanie stanami gier itp.

Jeśli nie masz nic przeciwko C / C ++; Proponuję rzucić okiem na SDL / OpenGL. Obsługuje niektóre czynności porządkowe, takie jak wprowadzanie danych, dźwięk, tworzenie okien itp., I może skupiać się na innych rzeczach.

użytkownik697111
źródło
4
Ahh dni, kiedy uczyłem się C ++ i gier konsolowych, były świetną zabawą ... [tworzy nowy projekt konsoli ...]
Nick Bedford
Zaktualizowałem moje pytanie, mam nadzieję, że dadzą mi wiele niesamowitych zasobów :)
Wazery
4

SDL + OpenGL to doskonały wybór do uruchomienia niestandardowego silnika gry.

Osobiście używam wersji C ++ w języku C, ponieważ odkryłem, że działa najlepiej dla mnie. Rozumiem przez to, że nie używam żadnych wyjątków. Są tego dwa powody: przede wszystkim wyjątki wymagają wyjątkowego bezpiecznego kodu, który nie jest łatwy do osiągnięcia w przypadku OpenGL i SDL. Co ważniejsze jednak, w ten sposób bardzo łatwo można eksponować obiekty C ++ w C ABI, co jest niezwykle pomocne, jeśli próbujesz wprowadzić język skryptowy do miksu.

Jestem w podobnej łodzi niż ty i zapisałem niektóre z moich przygód z SDL i OpenGL na blogu ( immersedcode.org ) na wypadek, gdyby ktoś był zainteresowany.

Jeśli chodzi o ogólną architekturę, mam dwie sugestie: jeśli chcesz silnik 3D, sprawdź książkę „Game Engine Architecture” Jason Lander. Jeśli wszystko, czego chcesz, to 2D, zachowaj prostotę projektu i pozwól się zainspirować XNA lub innymi projektami.

Wreszcie: nie dzwoń do OpenGL w całym miejscu. Zrób sobie przysługę i odizoluj ją w kilku miejscach, abyś mógł później przełączać się między OpenGL / OpenGL ES a nawet DirectX na pulpicie.

Armin Ronacher
źródło
0

Nie używaj C, chyba że szczegóły implementacyjne trzymają cię przy celowniku. W przeciwnym razie skorzystaj z C ++, ponieważ jest to znacznie bardziej wydajny język i zawsze możesz zdecydować, aby nie korzystać z tych możliwości później. Osobiście nie mam nic za / przeciw Pythonowi, nigdy go nie użyłem.

Nie poleciłbym OpenGL zamiast DirectX, ponieważ DX ma nowoczesne podejście obiektowe, które jest o wiele czystsze i bardziej zrozumiałe / mniej podatne na błędy. Interfejs oferowany przez OpenGL jest bardzo słaby w porównaniu.

Ostatnią rzeczą, jaką otrzymałem, jest to, że słyszałem od wielu osób, którym ufam, że GDB jest całkowicie do bani, a debugger Visual Studio jest zdecydowanie najlepszy. To nie jest moje osobiste doświadczenie, więc weź to z odrobiną soli.

DeadMG
źródło
4
„OpenGL vs. DX”. Fakt, że DirectX jest bardziej OO, nie jest tak naprawdę ważny. O ile jest to bardziej zrozumiałe ... OpenGL (przed wersją 3) udostępnia dość prosty interfejs, który jest łatwy do skanowania, ponieważ jest to wszystko w trybie imperatywnym w stylu C. „Ustaw macierz projekcji na to. Rozpocznij trójkąty. Oto wierzchołek. Oto wierzchołek. Oto wierzchołek. Trójkąty końcowe”. Seria OpenGL API 1.x jest dobra, aby zmoczyć stopy w programowaniu graficznym, a w połączeniu z SDL (lub nawet GLUT ... urg) pozwala uzyskać aplikację zawierającą około 30-50 linii kodu.
ChrisE
2
@ChrisE: Pewnie. Jest coś tak zwanego extern "C", a jego właściwe użycie sprawia, że ​​pisanie interfejsu C jest dość trywialne - szczególnie w przypadku Pythona, gdzie w programie Boost istnieje konwerter, który ułatwia powiązanie z nim. A co z funkcjami języka C ++? Są świetne . Większe wykorzystanie funkcji językowych C ++ zwiększa niezawodność projektu i łatwość masowego kodowania w celu uzyskania akceptowalnego, bardzo niewielkiego kompromisu wydajności. Funkcje języka C są żałosne w porównaniu. Na przykład poprawne użycie nowoczesnego kompilatora C ++ może zagwarantować brak wycieków pamięci. Zrób to w C.
DeadMG
1
@DeadMG: Jeśli OOP to naprawdę wielka sprawa, odpowiedź brzmi: Java lub C #, a nie C ++. Nie zgadzam się z tym, że użycie funkcji C ++ nie magicznie czyni twojego kodu lepszym, szybszym lub nawet bardziej niezawodnym; musisz wiedzieć, jak korzystać z tych funkcji, a czy nauka języka oprócz tworzenia silnika jest naprawdę dobrym sposobem na wykorzystanie własnego czasu? Nie. Nie dla kogoś, kto robi to po raz pierwszy. Możesz nauczyć się całego C w ciągu jednego lub dwóch dni, wygodnie i nigdy nie zastanawiasz się, co robi ten język. OpenGL, przydatny podstawowy zestaw połączeń w każdym przypadku, oferuje tę samą przejrzystość.
ChrisE
2
OOP nie jest aż tak wielkim problemem, nie w silnikach gier o wysokiej wydajności. Jasne, że jest to przydatne, ale często jest to niewłaściwa abstrakcja. Dobry przepływ danych, lokalizacja i układ pamięci są zwykle lepsze. Podczas gdy wiele zespołów używa C ++, nie korzysta z większości funkcji C ++. Bez wyjątków, jak najmniej wirtualnych, jak to możliwe, bez RTTI, bez STL / Boost. Dlaczego? Przewidywalne i szybkie wykonanie oraz niewielki kod na wielu platformach. Piszę w C i są tylko dwa obszary, w których wolałbym używać C ++: zamki o zasięgu i ogólne tablice. Nie warte kłopotów IMHO.
nieważne
4
Na GL vs. D3D: W rdzeniu GL3 / 4 nie ma stosu matryc i nie ma stosu atrybutów. Zarówno GL, jak i D3D mapują na tę samą architekturę sprzętową, ale dużo czasu GL wydaje się cieńszy. Pewnie, że maszyna stanu GL jest trochę kłopotliwa, ale tak samo jest ze sprzętem;) Uczenie się każdego z nich jest w porządku, i dopóki rozumiesz, co się właściwie dzieje, możesz łatwo przełączyć się na inny (lub interfejs API konsoli).
nieważne