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


#13

Nie, nie odświeży rynku, bo najprawdopodobniej nie zostanie nawet zauważony. Żeby mmorpg zaczęło żyć potrzeba kasy na promocję. Kasy albo wydawcy. Potrzebna jest tez jakość i bezbłędne wykonanie a tego ze swoim poziomem wiedzy nie jesteś w stanie zapewnić. Ty jeszcze nie wiesz jak mało umiesz.

To zawsze jest mniej więcej tak, że ludzie, których zdobywasz są na podobnym poziomie co ty. Albo niższym. Marne szanse, że dołączy ktoś doświadczony.

Twoja wiedza jest więc nie usystematyzowana. Zajmij się prostymi ćwiczeniami.

A to dlatego, ze to jest po prostu wyższa szkoła jazdy. Tu trzeba na prawdę siedzieć głęboko w zagadnieniach backendowych, sieciowych. W grę wchodzi tez wybór odpowiednich narzędzi i technologii. Jak ktoś postawi serwer na Unity to pozostaje mi tylko życzyć mu powodzenia i żeby na raz nie wlazło za dużo graczy :slight_smile:

Przygotuj się więc na to, że będziesz się cieszył być może w nieskończoność. Czeka cię niezliczona ilość przeróbek, poprawek lub pisanie pewnych rzeczy kompletnie od zera, bo w pewnym momencie zaczniesz sobie zdawać sprawę, że to, co napisałeś wcześniej jest po prostu złe. Owszem, można nauczyć się wszystkiego w trakcie realizacji projektu, ale niestety, zagadnienie jest na tyle grube i skomplikowane, że w czasie, jaki ci zajmie ogarnięcie, zrozumienie wszystkiego i nabycie odpowiedniej wprawy zwyczajnie znienawidzisz ten swój projekt.
Dużo więcej byś się nauczył tworząc małe projekty.

Odłóż to mmo na później, mówi ci to zawodowy programista, który od 15 lat zarabia programowaniem na chleb i piwko. Kiedy w takim razie zacząć? A no wtedy, gdy już na starcie projektu będziesz dokładnie wiedział w jaki sposób trzeba go wykonać.


#14

Myślę, że szybciej nauczę się programować robiąc, coś co mnie wciąga, czyli mmorpg, niż program do księgowości online. Przed zarejestrowaniem się na gamedev zrobiłem cały kurs od Raining Chain. Tutaj można zobaczyć jak wygląda gra https://www.youtube.com/watch?v=BDnIRtuAyTE. Jest to mmorpg via browser. Przed tą grą zrobiłem ponga, asteroids i bombermana. Kilka lat wstecz robiłem skrypty do swojego serwera OTS. Wolałbym pójść w kierunku C# lub C++, gdzie jest dostępnych dużo poradników, lub kontynuować tworzenie w JavaScript, tylko wciąż nie wiem, czy dam radę stworzyć taką mechanikę renderowania mapy jak w Tibia, i wielopoziomowość budynków i mapy jak w Ultima Online, czy również Tibia. Jakie silniki polecanie w języku JavaScript? W języku C# i C++ co jest wartego uwagi oprócz Unity? Co sądzicie o Unreal Engine?


#15

JavaScriptem można zrobić wszystko co potrzebujesz na frontendzie. Pytanie, czy będziesz umiał. Myślałeś w ogóle o backendzie i technologiach, które tam użyjesz?
Co do UE i innych silników - na frontendzie nie ma to na prawdę żadnego znaczenia. Każdy z tych silników jest w stanie obsłużyć dużo bardziej skomplikowane pod względem wyglądu gry. Do tego celu najlepszy będzie silnik który znasz najlepiej. I jeśli w tym momencie myślisz, że któryś z silników będzie miał jakiegoś ‘gotowca’ na to co potrzebujesz to w ogóle zapomnij o tym projekcie.

Główną część backendu robisz w jednym z trzech następujących technologii/języków: C++, C# .NET, Java


#16

frozenshade jaki w takim razie polecasz język programowania do nauki, powiedzmy, że dam sobie 6 do 12 miesięcy na naukę samego programowania. Zacznę od JavaScriptu, żeby nauczyć się frontendu, następnie przejdę na C++, C# i zajmę się nauką backendu. Jak wiele zależy od frontendu, czy np. wielkość mapy gry, renderowanie, wygląd gry, zależy od frontendu? Dobrze rozumiem, że jeśli JavaScriptem mogę zrobić wszystko, co potrzebuję na frontendzie, to równie dobrze Ultima Online, która jest napisana w .NET mogłaby chodzić tak samo dobrze na www jak na swoim cliencie?


#17

Do backendu podałem ci trzy.

Frontend to wyświetlanie + podstawowe przetwarzanie + komunikacja z backendem. frontend jest niezwykle istotny :wink:

Na pewno jest to do zrealizowania. I na pewno rozwiązanie oparte o JS będzie dużo bardziej zasobożerne niż np w wersji z dedykowanym klientem. Słyszałeś o Unreal Tournament w przeglądarce? https://icculus.org/ut99-emscripten/

Wspominałeś, że napisałeś ponga. No to może zamiast porywać się z motyką na słońce i robić mmo przy twoim poziomie wiedzy, zacznij od czegoś prostszego ale zmierzającego w tym kierunku.
Napisz ponga w wersji sieciowej. Potem napisz serwer ponga tak, żeby gracze za pomocą klientów mogli rozgrywać sobie meczyki. Dodaj możliwość oglądania meczyków przez osoby nie grające. Napisz bota do ponga który będzie rozgrywał meczyki z inną instancją siebie samego. Odpal 10 instancji, obserwuj co się dzieje. odpal 100 instancji. Odpal 1000 instancji.
A, no i najważniejsze :slight_smile: Testuj to poza localhostem ^^


#18

W takim razie na chwilę obecną skupiam swoją uwagę na JavaScript i frontendzie. A powiedz mi jeszcze, dlaczego JavaScript nie jest wykorzystywany do pisania backendu?


#19

bo jest poprostu wolny… i zasobozerny


#20

A kto powiedział, że nie jest? Jest takie coś jak NodeJS. I doskonale spełnia się po stronie backendu w wielu małych projektach.
Chodzi o to, że do gry mmo potrzebna ci wydajność oraz pełna kontrola nad zasobami, których Node ci nie zapewni. Pełną kontrole uzyskasz w C++, trochę mniej, ale na na prawdę wystarczającym poziomie będziesz miał w C# .NET i w Javie.

Moje osobiste zdanie na temat platformy Node jest takie, ze powstało to dla tych wszystkich nieogarów, dla których opanowanie drugiego języka programowania to zbyt duży wyczyn. A w rzeczywistości powstało to dlatego, żeby biznes mógł do prostych backendów angażować ludzi od frontendu. Backendowcy z natury są drożsi.


#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.