PHP - jak ugryźć temat naliczania zasobów w grze typu oGame/Tribalwars


#1

Witam

Czy ktoś przerabiał temat jak poradzić sobie w PHP z naliczaniem produkcji surowców/budynków/jednostek oraz innych zdarzeń w grze typu oGame/Tribalwars? Czy ktoś może mi podpowiedzieć jak rozwiązać ten wydawało by się banalny problem?

Pozdrawiam
Marcif


#2

Kiedyś myślałem o tym. Jest cała rodzina tego typu problemów

Jak dla mnie można to rozwiązywać na dwa sposoby:

  • w czasie rzeczywistym
  • na żądanie

Do tego pierwszego pewnie byś chciał zaprzęgnąć scheduler, który raz na jakiś czas będzie robił update stanu i nanosił zmiany. Nie wiem jak to wygląda w PHP.

To drugie rozwiązanie jest bardziej “tricky” i polega na zdefiniowaniu funkcji zmian stanu świata i odczycie stanu gdy jest on potrzebny. Później nadpisujesz ten stan i kolejna funkcja jedzie od poprzedniego “snapshota”. Często jest zwyczajnie zbyt trudno to zrobić, ale ta metoda jest o wiele bardziej wydajna. Do tego typu gry wygląda na to, że się nadaje. Wadą jest to, że nie da się w ten sposób rozpocząć akcji po stronie serwera, bo teoretycznie on ożywa dopiero jak budzi go klient. Jeśli np potrzebujesz wysyłać jakieś powiadomienia triggerowane po stronie serwera (push notyfikacje, maile itp) to musisz podłączyć coś co ożywia serwer (np scheduler).

Pomogłem? :stuck_out_tongue:


#3

Witam
Myślałem nad rozwiązaniem pierwszym ale jakby nie było muszę mieć pętle lecącą po kontach wszystkich graczy i robiącą analizę każdego z nich. Przy dużej liczbie graczy rozwiązanie wydaje się zabójcze dla serwera.
Czy ktoś może ma jeszcze jakiś inny sposób lub coś podobnego robił?
Pozdrawiam
Marcif


#4

Ja kiedyś robiłem to tak, że:
-miałem zapisany czas ostatniego update surowców każdego z osobna
-sprawdzałem do jakiego czasu mam przeliczać surowce (przyjmijmy, że do aktualnego czasu)
-jeżeli przy tym sprawdzeniu nie jestem wstanie wyprodukować jednostki surowca nie zmieniam czasu update, jeśli tak zaokrąglam w dół liczbę surowców do całkowitych, obliczam potrzebny czas na ich wydobycie i doliczam czas do update

Z budowaniem, jednostkami robiłem kolejkę budowy w jakiejś tabeli. Wyglądało to tak, że przed updatem surowców sprawdzałem czy jakiś budynek nie kończy się budować, Jeśli tak, to do opisu powyżej brałem czas końca tego budowania (już nie aktualny), przeliczałem, i ponownie sprawdzenie w pętli dopóki kolejka budynków które się skończyły budować nie będzie pusta. To rozwiązuje problem wybudowania np. nowego tartaku który daje więcej drewna.

Ruch wojsk i interakcja to już kolejne sprawdzenia i przeliczanie dwóch graczy do danego czasu, później obliczenia walki itd. Tak więc serwer liczy dopiero jeśli gracz jest aktywny bądź ktoś wykonał na nim jakąś akcje.


#5

Czyli miałeś to wszystko ogarnięte w pętli, która działała 24h/dobę na serwerze? Czy tą pętle odpalałeś w jakichś odstępach czasu czy po prostu działo to cały czas na serwerze?
Powiedzmy, że zrobię ten mechanizm w CLI bo wtedy mogę wyłączyć ograniczenie czasu wykonania skryptu PHP ale dochodzi tutaj sprawdzanie co jakiś czas czy ten skrypt jest odpalony ale to już chyba trzeba by ogarnąć po stronie samego linuxa?


#6

Nie, tylko w momencie “odświeżania” strony przez gracza. Update tylko jednego gracza i ewentualnie innych jeśli występuje interakcja. Jeśli zrobisz na zasadzie pętli 24h która obsługuje listę “akcji” ( kończenie budowania itp.), to w tych momentach robisz update surowców, a u klienta na podstawie ostatniego update i chwilowego wydobycia przesyłasz przybliżoną wartość jaką by miał na daną chwilę już bez obliczeń i update w bazie.

PS. ja kiedyś jak to robiłem nie miałem możliwości odpalić na hostingu skryptu działające w tle, stąd różne możliwe podejście do tematu.