Wątek przeniesiony 2018-10-15 10:55 z Java przez aurel.

Gry przeglądarkowe

4

Cześć - tak się ostatnio zastanawiałem. W jaki sposób działa serwer gier typu Ogame, Plemiona itd ? Czy tam każda akcja typu polecenie wybudowania budynku,zaczytanie info o stanie bazy militarnej czy wysłanie floty wymaga operacji na bazie danych ? Czy może jak user loguje się to z bazy wyciągane są dane na temat jego bazy (budynków, surowców, floty), zapisywane są do jakiejś struktury danych w pamięci, user wykonuje tam jakieś akcje, coś pobuduje itd i dopiero załóżmy godzinę po zalogowaniu idzie update do bazy ?

0

Też się nad tym zastanawiałem, fajnie by było gdyby ktoś ktoś kto miał styczność z tematem powiedział parę słów.

0

Trochę pykałem w gimnazjum w plemiona. . Nie wiem jak w Ogame ale w dajmy na to plemionach miało być jakieś updatowanie to robi się ono w ułamku sekundy. Są bowiem akcje takie jak uniki czy klinowanie, które polegają na przykład na wyprowadzeniu wojsk na sekunde przed atakiem po to by sekunde po ataku wprowadzić je ponownie. Podobnie surowce są naliczane sekunda po sekundzie

0

No właśnie rozmyślałem na temat np. updatowania surowców. Jedyny pomysł póki co miałem taki, że będę zapisywał datę ostatniego updatu, liczył sekundy między updatami i przemnażał przez jakiś współczynik wydobycia i przy każdej potrzebie odpytania o surowce aktualizował tę datę.

0

Ale musisz uwzględnić zmienne takie jak najazdy użytkownika na inne wioski i powrót z łupami, najazdy wroga i utrata surowców. Musisz uwzględnić to że ludzie farmią wysyłając kilkadziesiąt ataków dookoła swoich wioch, musisz uwzględnić że tak robi połowa graczy i część wojska wraca bez łupów.

0

Jeśli odpytywanie o obecny stan surowców będzie się odbywało centralnie w 1 miejscu to niezależnie czy będzie to w momencie otwarcia przeglądarki, najazdu innego usera na wioskę itp. to zawsze będzie aktualny stan, tak że nie wygląda to na zbyt skomplikowane w realizacji.

1

@Bambo
Miałem bardzo podobny pomysł - ja bym to zrobił w taki sposób, że klient odpytywałby serwer o współczynnik wydobycia, a samo (wizualne) liczenie odbywałoby się po stronie klienta. Dopiero podczas akcji np. budowy budynku byłoby wysyłane zapytanie czy akcja jest w ogóle możliwa i na serwerze byłby liczony aktualny stan surowców dla miasta/gracza.

Zastanawia mnie za to jak sobie serwery radzą z takim rozkazem ataku - czy wszystkie rozkazy są wrzucone do jakiejś kolejki zadań która jest potem obsługiwana przez jakiś event loop co cały czas leci na serwerze, czy (w co wątpię) dla każdego ataku jest jeden wątek który śledzi jego działanie?

0

@CountZero:

Kurde jeszcze konkretnie nie wiem jak to zaimplementuję. Jak będziesz zainteresowany to mogę podesłać rozpisane wymagania i wstępny schemat architektury - tj. co z czym gada i w jaki sposób.

2

Miałem chwilową przygodę przy robieniu gry tego typu. Finalnie projek się nie skomercjalizował, ale coś tam zapamiętałem. Co do samych surowców to operacje na bazie wykonywane są najrzadziej jak tylko się da. To znaczy :

  • kiedy gracz się loguje (wczytujemy ostatni moment przeliczenia surowców. Do stanu w bazie, serwer przelicza ile dodać konkretnemu użytkownikowi surowców)
  • np. atak/grabież/etc. (kiedy gracz np. zostaje zaatakowany to serwer dokonuje ponownych przeliczeń)
  • stawianie budynków

Generalnie zasada jest taka, że zapisujemy ostatni moment przeliczenia oraz stan aktualny tego przeliczenia. Potem na podstawie timestap dokonujemy przeliczenia i voila.

Co do efektów wizualnych (naliczanie co jedną sekundę surowców) to po stronie klienta.

Dla odciążenia bazy do cache wpycha się najbliższe ileś (u nas było 100, co dawało odczyt z bazy raz na 30/40 minut) akcji oraz kontekstów (surowce gracza, jego wojska etc) i bez wykonywania operacji na bazie przeliczalo się dane z cache. Jeżeli jakaś akcja zakończyła się w kontekście jakiegoś gracza (np. budynek się zbudował a następne 100 akcji już go nie dotyczą) to leci Update do bazy.
Raz na godzinę warto zrobić update wszystkiego tak czy siak (co by przy wywaleniu serwera za dużo danych nie uciekło)

4

Większość z tych gierek jest zrobiona na jakiejś bazie SQL, przez to jest dużo problemów i z cachowaniem i z wydajnością.
Ale nie trzeba tak robić:
Dla przykładu moja gierka w ponga zrobiona na command sourcingu z projekcją w pamięci: https://github.com/javaFunAgain/ratpong
(to jest tylko przykład). na podobnej architekturzę robiłem kiedyś gierkę w stylu plemiona przez chwilę, ale projekt mnie zcancellowali (łobuzy).

0

Może znacie jakieś książki,blogi z tego tematu?

0

Tu
devcorner.pl/tworzenie-gry-przegladarkowej-01/

0

W sumie też kiedyś miałęm podejście i być może będę miał jeszcze jedno.
Po stronie backendu był po prostu monolit, jakaś bazka relacyjna i dużo cronów, które co jakiś czas (10-15 min) się odpalały i uruchamiały akcje typu "wydobycie, podliczenie surowców" czy "sprawdzenie które budynki powinny być już wybudowane".

Po stronie frontu jakiś client na Angularze5.

1
gspansky napisał(a):

W sumie też kiedyś miałęm podejście i być może będę miał jeszcze jedno.
Po stronie backendu był po prostu monolit, jakaś bazka relacyjna i dużo cronów, które co jakiś czas (10-15 min) się odpalały i uruchamiały akcje typu "wydobycie, podliczenie surowców" czy "sprawdzenie które budynki powinny być już wybudowane".

Po stronie frontu jakiś client na Angularze5.

Akurat sam właśnie robię grę podobną do plemion i postanowiłem dołączyć do forum. A tu akurat temat o mechanikę plemion.
@gspansky ale jaki jest sens odpalać crona co to 10-15 minut jak? Przykład:
Cron uruchomił się o godzinie dajmy na to 19:20 a następne uruchomienie jest zaplanowane o 19:30. Gracz wysłał wojsko do wioski które ma dotrzeć o godzinie 19:29 i od razu odświeża stronę więc tak czy inaczej musisz zrobić update np surowców o tej godzinie 19:29 (wtedy kiedy odświeża stronę). Czyli cron się spóźnił i nie był potrzebny. A przez następną godzinę wioska do której przyszło wojska nie ma żadnych interakcji więc po co zadanie w cron'ie ma robić na niej update jeśli nie jest to potrzebne? Jak dla mnie nie ma sensu co 10-15 minut męczyć bazy danych żeby podnieść ilość wszystkich surowców. Tym bardziej biorąc pod uwagę to że każdy użytkownik ma np 10 osad, jest tysiąc użytkowników to daje jakieś 10 000 rekordów do zaktualizowania gdzie to jest update samych informacji o surowcach. Dodatkowo musisz sprawdzić wszystkie kolejki budowy, ruchy wojsk, rekrutację i kupców.

0 użytkowników online, w tym zalogowanych: 0, gości: 0