Wykop.pl Wykop.pl
  • Główna
  • Wykopalisko217
  • Hity
  • Mikroblog
  • Zaloguj się
  • Zarejestruj się
Zaloguj się

Popularne tagi

  • #ciekawostki
  • #informacje
  • #technologia
  • #polska
  • #swiat
  • #motoryzacja
  • #podroze
  • #heheszki
  • #sport

Wykop

  • Ranking

    Ranking
  • Osiągnięcia
  • FAQ
  • O nas
  • Kontakt
  • Reklama
  • Regulamin

572

Nudziło mi się, więc napisałem przeglądarkową grę multiplayer

Nudziło mi się, więc napisałem przeglądarkową grę multiplayer

Koniec sesji, upały oraz skręcona kostka poskutkowały nadmiarem wolnego czasu, więc postanowiłem spróbować czegoś nowego. Zapraszam do przetestowania mojej pierwszej w życiu gry, w której wcielasz się w kosmonautę i zasiadasz za sterami statku kosmicznego ;) Opis i przemyślenia w znalezisku.

snowak
snowak
z
wykop.pl
dodany: 10.07.2015, 10:29:30
  • #
    rozrywka
  • #
    programowanie
  • #
    gamedev
  • #
    gry
  • #
    multiplayer
  • 209
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Vanar.io


Koniec sesji, upały oraz skręcona kostka poskutkowały nadmiarem wolnego czasu, więc postanowiłem spróbować czegoś nowego. Chociaż właściwie jako bordo i tak bym to napisał bez względu na okoliczności, bo po prostu lubię programować ;) Ostatnie projekty na studiach wybitnie mnie zanudziły, więc szukałem sobie czegoś przyjemnego i rozwijającego. Jako że gry multiplayer w przeglądarce ostatnio są całkiem popularne, nigdy czegoś takiego nie pisałem i lubię tworzyć aplikacje sieciowe, wybór był dość prosty. W efekcie powstała gra //vanar.io, w której wcielasz się w kosmonautę, zasiadasz za sterami statku kosmicznego i niszczysz innych. Na pierwszy rzut oka nic skomplikowanego, ale nie o to chodziło.

//vanar.io

Dlaczego taka gra?
Nie pasjonuję się grami na tyle, żeby tworzyć coś o rozbudowanej fabule, nie jestem też grafikiem. Jako programista szukałem czegoś, co koncepcyjnie będzie banalnie proste, lecz nietrywialne do napisania. Przypomniało mi się, że z dobre 10 lat temu w jakiejś starej dystrybucji Mandrake'a była dołączona gra, w której latało się statkiem kosmicznym i strasznie mnie wciągnęła. A więc padło na dynamiczną grę multiplayer i patrząc z perspektywy czasu, była to dość dobra decyzja - problemów było sporo i był to całkiem niezły wstęp do gamedevu. Wyszło około 13 000 linii kodu, więcej niż się spodziewałem.

Wybór technologii
Tutaj sprawa była prosta - skoro gra po stronie klienta działa w JavaScripcie a spora część kodu miała być współdzielona, najwygodniej na serwerze użyć tego samego - czyli NodeJS. Do tego jeszcze Redis do trzymania informacji o podłączonych serwerach, jakieś reverse-proxy i można działać.

Problemy z wydajnością
Niby V8 i inne nowe silniki JavasScript są szybkie, ale nadal zupełnie się nie nadają do takiej ilości obliczeń. Uzyskanie płynnej animacji wymagało spędzenia prawie tygodnia na jsperf.com (chwilowo leży, trzeba wchodzić przez cache google), przepisywania każdego fragmentu kodu po kilka-kilkanaście razy i użycia masy różnych sztuczek żeby poprawić wydajność i zminimalizować czas działania garbage collectora. Zaskoczeniem było, że po stronie serwera udało mi się uzyskać prawie dwukrotny wzrost wydajności, gdy zacząłem intensywnie używać nowości z EcmaScript 6. Tak czy inaczej strasznie syzyfowa praca, ale na szczęście jak się już raz przez to przejdzie, to później już się pamięta czego się wystrzegać...

Sam canvas również nie powala wydajnością, zwłaszcza gdy włączy się tryb pełnoekranowy. Szybkie rysowanie dynamicznych obiektów jest właściwie niemożliwe i wszystko trzeba intensywnie cache'ować. Może sytuacja się poprawi wraz z rozwojem WebGL.

Problemy z lagami
To bardzo fajny temat i jedno z głównych wyzwań w tym projekcie. W internecie można znaleźć sporo ciekawych artykułów jak radzono sobie z tym w Quake'u (który podobno przecierał szlaki) i jak się to robi obecnie. Trochę zdziwił mnie na początku fakt, że model symulacji //vanar.io najbardziej przypomina ten z fpsów i ostatecznie skorzystałem z podobnych tricków. Jakby ktoś chciał o tym więcej poczytać to dobry wstęp daje ten artykuł: //www.gabrielgambetta.com/fpm1.html

Boli mnie tylko, że w moim przypadku do skaczącego pingu dokłada się jeszcze podła wydajność JavaScriptu i jednowątkowe przetwarzanie danych. Pakiety są przetwarzane z jeszcze większym, mocno losowym opóźnieniem a przy dynamicznych zmianach przewidywanie stanów nie działa tak dobrze jak powinno i czasami widać lekkie lagi nawet na dobrym łączu.

Wnioski
Przyjemnie się to pisało, ale przy obecnej wiedzy pewnie nie zdecydowałbym się na napisanie takiej gry. Jest zbyt dynamiczna jak na możliwości JavaScriptu i mam wrażenie, że nie działa tak dobrze jak powinna. Ale może to tylko ja jestem przewrażliwiony, bo gapiłem się na to przez ostatnie 2.5 tygodnia ;) Chętnię usłyszę Wasze opinie i odpowiem na pytania.

I na koniec bonus dla graczy CS:GO i innych fpsów
Nie używajcie magicznych, "poprawiających" wydajność configów, które wyłaczają interpolację i inne mechanizmy walczące z lagami. Na pierwszy rzut oka może wyglądać to lepiej, ale w praktyce będziecie znacznie rzadziej trafiać przeciwnika (mimo animacji trafienia, którą zobaczycie na ekranie). Jednym z podstawowych tricków przy pisaniu dynamicznych gier jest wyświetlanie przeciwników z lekkim opóźnieniem, dzięki czemu nie trzeba zgadywać gdzie przeciwnik znajdzie się w następnej klatce, gdyby pakiety przyszły po czasie. Efekt jest taki, że zawsze strzela się do pozycji graczy z przeszłości a nie ich obecnego położenia. Serwer otrzymując pakiet informujący o strzale nie bierze pod uwagę stanu teraźniejszego, lecz odtwarza stan z przeszłości - tak jak to widział klient - na podstawie czasu wysłanego w pakiecie. Jeżeli wyłączycie interpolację możecie widzieć inny stan, niż ten odtworzony przez serwer - i nie będziecie trafiać. Warto też wspomnieć o jeszcze jednym skutku tego mechanizmu: nawet nie mając lagów, możecie zostać zabici zaraz po tym jak schowacie się za ścianą - ktoś mógł trafić w odtworzonym stanie w przeszłości.
O tym jak to jest zaimplementowane w CSie można poczytać tutaj: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

Treści powiązane (3)

bardzo podobna gra
Siergiej0
z agar.io
  • 31
Link do gry
snowak
z vanar.io
  • 24

Komentarze (209)

najlepsze

c.....r
c.....r
konto usunięte 10.07.2015, 10:39:18
  • 51
Świetna robota. Gratulacje!
  • 14
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych odpowiedziach

snowak
snowak
Autor
10.07.2015, 10:43:42
  • 6
@cbreaker: Dzięki, ciesze się że się podoba ;)
  • Odpowiedz
AlZima
AlZima
10.07.2015, 12:13:36
  • 5
Robota poczeka... Wiągnąłem się :D
  • Odpowiedz
mojemacki
mojemacki
10.07.2015, 11:01:46
  • 42
@snowak: te większe planety mogłyby mieć jakieś przyciągnie, żeby dało się na nich robić fajne manewry :p
  • 19
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych odpowiedziach

snowak
snowak
Autor
10.07.2015, 11:10:58
  • 14
@mojemacki: A to w sumie ciekawy pomysł, tylko obawiam się że byłyby problemy z wydajnością po stronie serwera. Już teraz liczenie kolizji na zbiorze do kilku tysięcy obiektów jest mocno obciążające :|
  • Odpowiedz
mojemacki
mojemacki
10.07.2015, 11:12:52
  • 6
@snowak: posyzyfujesz troszkę więcej, to może więcej wyciśniesz ;)
  • Odpowiedz
tomaszpc
tomaszpc
10.07.2015, 11:06:00
  • 37
Przyjemnie się chwilę pograło ( ͡° ͜ʖ ͡°) trochę minus, że brak sterowania strzałkami, ale za opis i tak wykop.
  • 13
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych odpowiedziach

tomaszpc
tomaszpc
10.07.2015, 11:15:08
  • 12
@snowak: Ale to dajesz i strzałki i wsad na sterowanie. Plus jeszcze enterem się powinno strzelać a shifty są z lewej i prawej. i wtedy gracz sam sobie wybiera jak mu wygodniej. Takie jest mapowanie domyślne np. w Unity.

A jak mam prawą rękę na strzałkach a lewą na spacji i shiftcie to też jest spoko.
  • Odpowiedz
snowak
snowak
Autor
10.07.2015, 11:16:51
  • 11
@tomaszpc: W takim razie wrzucam to na listę todo i uwzględnię przy najbliższej aktualizacji. Dzięki ;)
  • Odpowiedz
N.....r
N.....r
konto usunięte 10.07.2015, 12:43:46
  • 24

Komentarz usunięty przez moderatora

kamil062
kamil062
kamil062
10.07.2015, 16:08:34
  • 2
@Naglfar: Wątpię bo to byłoby nielegalne przerabiać czyjś kod. Autor poprostu zainsporował się i napisał podobną gierkę.
  • Odpowiedz
RacjeMam
RacjeMam
RacjeMam
10.07.2015, 19:46:47
  • 1
@kamil062: forkujesz i piszesz https://github.com/huytd/agar.io-clone na licencji MIT
Największy problem to zrobienie grafik
  • Odpowiedz
Cyril
Cyril
Cyril
10.07.2015, 10:51:24
  • 21
Byłem pierwszy z wynikiem 520 i się rozbiłem o Jowisza... myślałem, że to tło :(
  • 1
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych odpowiedziach

Ilythiiri
Ilythiiri
10.07.2015, 13:21:49
  • 0
@Cyril: Ja popełniłem sepuku o planetę typu Jowisz po przekroczeniu 1000 punktów, nikt nie mógł mnie ustrzelić ;-)
  • Odpowiedz
Hejkumkejkum
Hejkumkejkum
Hejkumkejkum
10.07.2015, 11:16:00
  • 18
Gra nie jest grywalna z jednego powodu. Przydałby się jakiś poziom energii dla każdego statku, bo wystarczy że dostanie kulkę i po nim. Takie coś zniechęca i zabija grywalność. Agar ma tą przewagę, że rozgrywka trwa dłużej.
No i niewygodnie sterować lewą ręką zamiast kursorami zważywszy, że jest jeszcze spacja do strzelania.

Czy mógłbyś podać jakieś niuanse konstrukcyjne dla laika, sam chętnie zgłębiłbym temat robienia gier ale na razie nie wiem czego
  • 11
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych odpowiedziach

snowak
snowak
Autor
10.07.2015, 11:46:28
  • 14
@Hejkumkejkum: Od jednego pocisku można zginąć tylko od znacznie większego statku, lub gdy ma się bardzo mało punktów i od razu spadnie poniżej 10. Ale zastanowie się czy da się to jeszcze jakoś ulepszyć.

Twoje pytania są dość ogólne, ale jeżeli chciałbyś spróbować napisać własną grę, to generalnie trzeba:
* dobrze poznać sam JavaScript
* napisać trochę prostych stron w NodeJS, żeby zrozumieć jak tam działa przetwarzanie zdarzeń i nabrać odpowiedniego sposobu myslenia
*
  • Odpowiedz
snowak
snowak
Autor
10.07.2015, 13:16:50
  • 2
@wirujacy_szeryf: @KubusiowyKubus: 100 000 osób online w jednej chwili to nie 100 000 wyświetleń. Zakładając, że każdy gra przez 10 minut, to daje conajmniej 14 milionów odsłon. A jeszcze z tego co widzę, korzystają z jakiegoś dostawcy, który pozwala na okresowe odświeżanie reklam, więc tych odsłon jest jeszcze więcej.
  • Odpowiedz
G.....a
G.....a
konto usunięte 10.07.2015, 13:02:14
  • 9
Nudziło mi się, więc zrobiłem kijową wersję populkarnej gry i nazwałem ją podobnie do popularnej gry, wszystko żeby zarobić na reklamach.
( ͡° ͜ʖ ͡°)
  • 1
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych odpowiedziach

plasticstone
plasticstone
plasticstone
10.07.2015, 17:05:01
  • 3
@Giekaczka: handluj z tym ( ͡° ͜ʖ ͡°) ( ͡° ͜ʖ ͡°)ノ⌐■-■ (⌐ ͡■ ͜ʖ ͡■)
  • Odpowiedz
PanMieszko
PanMieszko
10.07.2015, 11:28:40
  • 7
Fajna gierka, punktów narobiłem i dalej nie chciało mi się grać (✌ ゚ ∀ ゚)☞
PanMieszko - Fajna gierka, punktów narobiłem i dalej nie chciało mi się grać (✌ ゚ ∀ ゚...

źródło: comment_QAc6XF3osfQvPTyAviaXcrBSYKDvBeF7.jpg

Pobierz
  • 6
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych odpowiedziach

U.....i
U.....i
konto usunięte 10.07.2015, 12:13:43
  • 2
@PanMieszko: Gratuluję Mistrzu!
  • Odpowiedz
doktor_gonzo
doktor_gonzo
10.07.2015, 16:35:50
  • 1
@mirun: Tak myślałem, że dokonałeś autodestrukcji. Po twej śmierci przejąłem prowadzenie, ale już mając ponad 8 tys. pkt. nie było z kim walczyć, więc dokonałem "suicide by space sheriff".

  • Odpowiedz
the_bogus_man
the_bogus_man
10.07.2015, 15:18:56 via Android
  • 6
Mój autopilot:)
thebogusman - Mój autopilot:)

źródło: comment_yQMjwlKJ5IoeHEXOBwm4MuP9mNLgmOAT.jpg

Pobierz
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych odpowiedziach

vogello
vogello
vogello
10.07.2015, 12:49:55
  • 5
Ładnie przekonales mnie zeby wylaczyc Adblocka :D
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych odpowiedziach

  • <
  • 1
  • 2
  • 3
  • 4
  • 8
  • Strona 1 z 8
  • >

Hity

tygodnia

PILNE: Domagamy się delegalizacji posiadania i hodowli niebezpiecznych ras psów
PILNE: Domagamy się delegalizacji posiadania i hodowli niebezpiecznych ras psów
7675
W nosie mam segregację butelek. Niedługo każą mi pracować w PSZOK
W nosie mam segregację butelek. Niedługo każą mi pracować w PSZOK
3669
Luxmed abonament = brak terminów. No chyba, że zapłacisz za wizytę, to od ręki
Luxmed abonament = brak terminów. No chyba, że zapłacisz za wizytę, to od ręki
3240
Sąd zdecydował. "Wtorki dla pań" w saunie to dyskryminacja mężczyzn
Sąd zdecydował. "Wtorki dla pań" w saunie to dyskryminacja mężczyzn
3065
Newsweek próbuje wmówić ludziom, ze pitbull to przytulanka, a gorsze są male psy
Newsweek próbuje wmówić ludziom, ze pitbull to przytulanka, a gorsze są male psy
2941
Pokaż więcej

Powiązane tagi

  • #ciekawostki
  • #zainteresowania
  • #kultura
  • #heheszki
  • #muzyka
  • #film
  • #gry
  • #humor
  • #swiat
  • #technologia
  • #polska
  • #nauka
  • #sport
  • #wykop
  • #youtube

Wykop © 2005-2025

  • O nas
  • Reklama
  • FAQ
  • Kontakt
  • Regulamin
  • Polityka prywatności i cookies
  • Hity
  • Ranking
  • Osiągnięcia
  • Changelog
  • więcej

RSS

  • Wykopane
  • Wykopalisko
  • Komentowane
  • Ustawienia prywatności

Regulamin

Reklama

Kontakt

O nas

FAQ

Osiągnięcia