[MMORPG VIA WWW] Perspective, Ultima VI, VII, Tibia


#21

Rozumiem, sam używałem NodeJS, do mojego mmorpg. Teraz jednak widzę, że mam w tym wszystkim jeszcze za małą wiedzę. Co sądzisz o opinii, którą znajduję na różnych forach, że nie warto uczyć się C++, bo to przestarzały język, nawet jeśli chodzi o tworzenie gier. Chcę nauczyć się programować, ale zastanawiam się ile czasu poświęcić na jaki język i od którego języka zacząć. A może uczyć się dwóch jednocześnie, frozenshade, co o tym sądzisz?


#22

Tak jak wyżej, wybierz któryś z języków, który sprawdzi się w backendzie i wykorzystaj go również na front :wink:


#23

C++ nie jest przestarzały. Na chwilę obecna jest to jeden z najszybszych języków. Problem polega tylko na tym, że zrobienie czegoś w C++ zajmuje przeważnie więcej czasu niż zrobienie tego samego np w takim C#. Programista z małym doświadczeniem nie wykorzysta wszystkich zalet programowania w języku natywnym. Dla indie developera pisanie w C++ pochłonie mu zbyt wiele czasu. Warto znać ten język, w ogóle zacząć od niskiego poziomu, implementować listy, sortowania itp - to uczy myślenia, ale dziś każdy chce już od razu pisać gry :wink:
Jedno ci powiem - jak ogarniesz C++ to potem ogarniesz każdy inny język, niektóre będą cię tylko wkurzać bo będziesz miał wrażenie że ‘o jakie one są zabałaganione z tymi swoimi słabymi typowaniami’ :slight_smile:


#24

Dobra to chyba ja się powinienem wypowiedzieć na ten temat ponieważ z tego forum to chyba najwięcej mam z tym wspólnego.
Przede wszystkim napisałem pracę licenjacką jak dokłądnie taką grę zrobić jaką Ty byś chciał poza tym byłem developerem przez jakiś czas przy The Forgotten Server (prywatny server Tibii).

Parę odpowiedzi na Twoje pytania:

  • nie pisz tego dla przeglądarek www. Czemu? Zbyt wolne, grafika muli w połączeniu z sieciowym przesyłaniem pakietów. Zobacz, że Ultima Online ma desktopowego klienta (tak samo jak Tibia już). Więc nie ma sensu robić tego w java scrypcie.
  • pisz w Javie. Czemu? Prosty język programowania (zwłaszcza jak pisałeś w JS) no i mnóstwo gotowych super silników 2D najlepszych w obecnym czasie na rynku -> LibGDX, który w rankingach prześciga zawsze Unity
  • https://www.youtube.com/watch?v=2deCwZ5-3wM -> tutaj masz to jak renderować klatkę animacji
  • pamiętaj, że viewport jest o jedną kartkę większy od tego co gracz widzi na ekranie (tak żeby nie było widoczne wczytywanie assetów -> tekstur)
  • do programowania akcji na serwerze używaj języka LUA, ale to chyba już standard jeżeli chodzi o MMORPG bo nawet w Wowie tego używają

Jak coś to śmiało pisz. Może nawet bym podesłał moją pracę dyplomową to byś sobie popatrz jak tam tłumaczę jak zrobić taki silnik, ale chyba będzie lepiej dogadać się na priv chociaż uprzedzam że ciężko mi się cokolwiek tłumaczy :stuck_out_tongue:

Poczytaj sobie mój temat (Prezentacja mojego silnika MagicEngine) i popatrz na screeny zwłaszcza starej wersji mojej gry :slight_smile:


#25

Nauczy nauczy. Mi też tak mówili a taką grę zrobiłem :stuck_out_tongue:.

Zacząłem robić silnik do mojej pierwszej gry MMORPG w 2014 i to właśnie była prosta gra 2D. Dzisiaj programuje silnik w oparciu o Engine Wiedźmina 2 i 3. A nie minęło jeszcze 10 lat.

Nie jest to problem bo jedyna technika jaką kiedykolwiek ktoś wymyślił została zrobiona przy Quake 3 Arena. Później tylko programista Counter Strike’a dodał parę poprawek. Dzisiaj w każdej grze sieciowej te schematy są powielane.

Gość ma dużą rację bo sam zacząłem programować od C++, a dopiero po 8 latach przeniosłem się na Jave, która jest 100 razy lepsza, niemniej dużo to mi dało. Jednak jeżeli chodzi o gry 2D to robienie ich w C++ mija się z celem. Po co taki język do takiej prostej architektury silnika.C++ przydaje się do programowania albo pralki (mało pamięci i specyficzne jej wykorzystywanie) albo z drugiej strony skmplikowanych ładnych gier 3D (mało pamięci ze względu na ogrom assetów i ich wyświetlanie) w innym przypadku nie ma sensu pisać tego w tym języku.


#26

Dragomirus skoro nie jest to problem to czemu tak wiele gier się z nimi borykało/boryka ?


#27

W sumie to nie mam pojęcia bo architektura sieciowa jest akurat w MMO najprostszą rzeczą do zrobienia.Mogę się jednak domyślać, że większość z tych gier korzysta z serializacji obiektów co jest ogromnym błędem. Osobiście w pracy dyplomowej odradzałem korzystanie z tego rozwiązania zwłaszcza jak się korzysta z gotowej biblioteki sieciowej. Po prostu klasa zserializowana zawiera dodatkowe bajty, które w sumie to nawet nie mam pojęcia co robią, a nawet mogą nic nie robić. W związku z tym zaproponowałem takie rozwiązanie, że pakiet to tak naprawdę tablica bajtów w którym pierwszy bajt lub pierwsze cztery w moim przypadku gry 3D nie są szyforwane. Reszta jest w zależności od tego co to za pakiet. W momencie kiedy logujemy się do gry nasze hasło, login oraz wygenerowane klucze XTEA są szyforwane za pomocą RSA (klucz może być bezpośrednio ściągnięty z serwera w takcie połączenia (moim zdaniem lepsze rozwiązanie) lub wbudowany w klienta gry (rozwiązanie w Tibii)). Następne pakiety są szyforwane za pomocą już XTEA ze względu na szybkość. Tutaj przykład tego jak powinno się pisać takie coś:


#28

Tak, może nauczy się, jeśli tylko starczy mu sił i skilla. Chodzi o to, że na chwilę obecną on nie ma żadnej wiedzy, uczenie się od zera na tak dużym docelowym projekcie nie ma sensu bo ewentualne wyniki zobaczy dużo później niz w przypadku prostego ćwiczenia. Dużo trudniej mu będzie wykonać odpowiednie testy a w momencie, gdy zda sobie sprawę z błędów, jakie popełnił, przeróbka programu będzie dużo bardziej czasochłonna. Dlatego zaproponowałem proste ćwiczenie z pongiem sieciowym. Proste, ale gwarantuję, że zajmie go na bardzo długi czas i wiele się przy nim nauczy. I jestem niemalże pewien, że na dzień dzisiejszy on nie ma nawet pojęcia jak takie ćwiczenie wykonać a porywa się tu na ememo-erpegie.

To oraz pewnie setki innych pozornie nie wpływających na wydajność rzeczy. Bo na localhoście przy obciążeniu wynoszącym 10 klientów wszystko działa, ale w boju to już tak wesoło nie wygląda.
Gamedev to w wielu przypadkach ludzie bez jakiegokolwiek doświadczenia. Robią tak jak pokazali w tutorialu albo kupują gotowy kawałek kodu, który realizuje dane zagadnienie i który działa wyśmienicie w warunkach ‘laboratoryjnych’. Niestety, ale do pewnych rzeczy jest wymagane doświadczenie. Najpierw trzeba kilka razy spaprać albo się nasiedzieć wyszukując potencjalne wąskie gardła żeby potem pisząc nowy kod od razu wiedzieć z jakimi problemami przyjdzie sie borykać i odpowiednio sobie wszystko zaprojektować.


#29

No też racja, ale może w sumie pisać protokoły sieciowe poprzez właśnie takie mini programy, które coś już same robią na przykład właśnie pingowanie, wysyłanie prostych pakietów. Ja jak zaczynałem to pisałem to tak, że wysyłałem stringa, który zawierał jakiegoś rozgranicznika typu “;” i w ten oto sposób łatwo pakować i rozpakowywać pakiety, a później wiadomo, że można to rozpakowywanie/pakowanie wiadomości przerabiać na tablice bajtów na przykład.

To i jeszcze czytanie sporej ilości artykułów naukowych. Z tego co pamiętam to Quake 3 Arena miał właśnie artykuł naukowy o protkołach sieciowych, tak samo Counter Strike’a. Nawet gdzieś w necie czytałem o obu teoriach spakowanych w jeden artykuł. Trzeba jednak uważać bo czasami jest hype na jedną rzecz o której później wszyscy zapominają -> Light Pre-pass rendering na przykład wydaje mi się że był taką rzeczą.


#30

Cześć, nie chciało mi się czytać całego wątku ALE,
Drogi Bytnio, z doświadczenia podpowiem Ci, żebyś zaczął od testów “skali”. Sam zaczynałem naukę Unity i w ogóle przejście z biznesu do gamedevu marzeniem o stworzeniu nowej, lepszej Ultimy, dlatego, że zawiódł mnie zarówno Shroud of The Avatar jak i Legends of Aria. Przez ~3 lata prototypowałem grę z użyciem UNETa w Unity co było dużym błędem, Wszystko było fajnie, bardzo dużo funkcjonalności, wszystko działało póki nie zrobiłem pierwszego bardzo małego stress testu i okazało się, że gra się totalnie nie skaluje. Dzisiaj jestem już zawodowym gamedevem i nadal tworzę moją wymarzoną grę po godzinach ale tym razem nie od dupy strony dlatego mam dla Ciebie rade, zacznij od testów skali i warstwy sieciowej. Kilka miesięcy zajęło mi stworzenie architektury server-client która obsłuży mi na jednej maszynie 1k graczy i kilkanaście-kilkadziesiąt tysięcy aktywnych obiektów gry.

Jeszcze nie wszystko jest gotowe bo Unity rzuca kłody pod nogi ale z component systemem, który wchodzi powoli do Unity dam rade zeskalować odpowiednią liczbę (potrzebuje około ~30k) aktywnych obiektów sieciowych.
Uwierz mi, że jestem całkiem niezłym programistą i stworzenie gry, która skaluje się na pojedynczej maszynie na liczbę 1k graczy uwzględniając, że na każdego gracza może przypaść 20-30 aktywnych obiektów z których żaden nie jest częścią wspólną obiektów innego gracza (tzn, wszyscy rozbiegają się po mapie w inne miejsce) jest co najmniej trudne.

Nie zaczynaj od gameplayu bo wszystko kiedyś wyrzucisz tak jak ja swoje 3 lata pracy. Nie mówię, że samo doświadczenie niczego Ci nie da bo da bardzo wiele, ale szkoda zmarnowanej pracy.
Jak byś miał jakieś pytania to mogę Ci przybliżyć skalę problemu i rzeczy z którymi ja musiałem się mierzyć tworząc ten server. f.zielinski.gliwice@gmail.com


#31

A że tak głupio zapytam… po co ci powolne Unity na backendzie? Przejście na .NET da ci przynajmniej 3x większą wydajność a nadal programujesz w C#. Widziałem wiele testów porównawczych Mono vs .NET, sam nawet musiałem popełnić w Mono kilka rzeczy i tą różnicę w wydajności szybko odczułem.


#32

Dla obsługi poruszania się po meshu/terrenie oraz dla raycastów i to w sumie tyle, mimo, że server odpalam bez grafiki to musze być w stanie sprawdzić raycastem czy ktoś kogoś może uderzyć, poruszać obiektami a robie to z pomocą navmesha, musiałbym pół silnika organizować po stronie silnika żeby zapewnić takie rzeczy, a przynajmniej tak mi się wydaje. Na razie całość mam bardzo mało “korzystającą” z Unity (mam na myśli stronę serwerowa) i mam taki cichy plan wyciągnąć to z Unity i zrobić jakąś komunikacje między procesową w ramach tego samego komputera. Nie bawiłem się jeszcze i musiałbym wiedzieć jaka jest tego wydajność, czy jest sens i nie lepiej zostawić sobie łączenie po localhoscie ale z drugiej strony przy okazji prezentacji Component i Job Systemu CTO Unity wspominał, że pracują nad dodaniem .neta do Unity. Zresztą .net standard 2.0 już jest i działa, chociaż trzeba ustawić backend na IL2CPP i nie nie testowałem wydajności tego rozwiązania dokładniej, odpaliłem raz projekt pod .net standard i nie było żadnej różnicy.