Gra MMO

0

Zabrałem się za napisanie prostej gry 2d, standardowo core sprowadził się do tzw. GameLoopa, a w nim

while(running) {          
                update();
                render();
        }

Dzięki czemu 60 razy na sekundę odświeżam poszczególne komponenty gry i je renderuje na ekranie. Wszystkie dane o świecie po jakim się poruszam znajdują się lokalnie u mnie, jednak chciałbym pójść o krok dalej - czyli pobierać dane z innej aplikacji, serwera. O ile nic mi nie umknęło, pozwoliłoby to na połączenie wielu klientów do jednego serwera / świata gry i stworzenie namiastki gry MMO. W teorii brzmi prosto, tyle że jak zrealizować takie połączenie client - server? Dotychczas korzystałem z Socketów, tyle że były to aplikacje typu chat, blackjack, itp. Dane wysyłane były tylko gdy była taka potrzeba. Tutaj aplikacja klienta przed wywołaniem update() musiałaby zsynchronizować dane z serwerem, tj. wysłać aktualne dane o postaci gracza, serwer aktualizowałby dane świata i wysyłał je z powrotem do klienta. 60 razy na sekundę. Zastanawiam się więc czy moje podejście jest ok oraz jak to jest rozwiązane w prawdziwych grach MMO? Domyślam się, że pewnie większość z nich nie jest pisana w Javie, no ale mniejsza z tym ;)

1

W sumie pisałem coś takiego na drugim roku, kwestię komunikacji rozwiązałem w ten sposób, że komunikacja serwer-klient odbywała się po TCP (nawiązanie połączenia, wymiana komunikatów itp, także czat gry leciał po kanałach TCP) natomiast dane gry które miały prawo ulecieć i nie musiały być synchronizowane były wysyłane do serwera po UDP (ruchy gracza, a raczej dane o wciśnięciu/przytrzymaniu klawiszy) i multicastowane po UDP przez serwer (stan obiektów na mapie, bo to akurat była jakaś kosmiczna strzelanka 2d) :)

A kwestię synchronizacji komunikacji z pętlą gry załatwiłem tak, że obsługa kanałów komunikacyjnych TCP/UDP była w gestii odrębnych wątków serwera/klienta, a pętla gry na serwerze czy wyświetlanie u klienta były obsługiwane przez odrębny, a dane były przekazywane za pośrednictwem odpowiednich kolejek ;)

PS uprzedzam że takie podejście prawie na pewno nie było zbyt poprawne, ale tak czy owak działało, robiło robotę, glitchy praktycznie nie było a zużycie CPU też było rozsądne, tylko sieć płakała przez dużą ilość wymienianych danych...

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