Pracuję na ogólnym serwerze gier, który zarządza grami dla dowolnej liczby klientów w sieci z gniazdami TCP grających w grę. Mam „projekt” zhakowany razem z taśmą klejącą, która działa, ale wydaje się zarówno delikatna, jak i nieelastyczna. Czy istnieje dobrze ustalony wzorzec, w jaki sposób pisać komunikację klient / serwer, który jest solidny i elastyczny? (Jeśli nie, jak ulepszysz to, co mam poniżej?)
Z grubsza mam to:
- Podczas konfigurowania gry serwer ma jeden wątek dla każdego gniazda odtwarzacza obsługującego synchroniczne żądania od klienta i odpowiedzi z serwera.
- Jednak gdy gra się rozpoczyna, wszystkie wątki oprócz jednego snu i ten wątek przechodzi przez wszystkich graczy jeden po drugim, komunikując się o swoim ruchu (w odwrotnym żądaniu-odpowiedzi).
Oto schemat tego, co aktualnie mam; kliknij, by zobaczyć większą / czytelniejszą wersję, lub 66kB PDF .
Problemy:
- Wymaga od graczy odpowiedzi po kolei dokładnie z właściwą wiadomością. (Przypuszczam, że mógłbym pozwolić każdemu graczowi na przypadkowe bzdury i przejść dalej tylko wtedy, gdy dadzą mi prawidłowy ruch).
- Nie pozwala graczom rozmawiać z serwerem, chyba że jest to ich kolej. (Mogę poprosić serwer o wysyłanie aktualizacji o innych graczach, ale nie może przetwarzać żądania asynchronicznego).
Wymagania końcowe:
Wydajność nie jest najważniejsza. Będzie to głównie wykorzystywane do gier nie w czasie rzeczywistym, a przede wszystkim do stawiania sobie AI przeciwko sobie, a nie drżącym ludziom.
Rozgrywka zawsze będzie oparta na turach (nawet w bardzo wysokiej rozdzielczości). Każdy gracz jest zawsze przetwarzany jeden ruch, zanim wszyscy inni gracze otrzymają kolej.
Implementacja serwera dzieje się w Rubim, jeśli to robi różnicę.