JavaScript i PHP do gry wieloosobowej w czasie rzeczywistym? [Zamknięte]

13

Zastanawiam się, czy połączenie JavaScript po stronie klienta z serwerami PHP / mysql to dobry pomysł na gry przeglądarkowe dla wielu graczy w HTML5 w czasie rzeczywistym?

Moja wiedza techniczna jest bardzo ograniczona i chociaż planuję uczyć się node.js w przyszłości, krzywa uczenia się jest obecnie dość duża.

Ponieważ jestem już zaznajomiony z PHP, myślę, że działałbym znacznie szybciej.

Myślę, że skala wynosi od 2 do 8 graczy. I starając się, aby liczba wiadomości między klientem a serwerem była jak najniższa.

Wartości, które zamierzam przechowywać / obsługiwać to:

  • Nazwa i identyfikator gracza.
  • Pozycja X i Y.
  • Zdrowie.
  • Wyposażone przedmioty (maksymalnie 8 miejsc, prawdopodobnie mniej).
  • Akcje (chód, atak, użycie itp., Ale tylko 1 akcja / gracz na raz).
  • Współrzędne i trajektoria punktora X, Y.
  • Nazwa gildii / klanu.
  • I kilka podstawowych funkcji czatu / mailingu.

Sądzę, że chociaż nie jest to najlepsze rozwiązanie, ale jeśli utrzymuję małą logikę, jest to całkowicie wykonalne. Czy mam rację?

justanotherhobbyist
źródło
4
Brzmi doskonale wykonalne. Dlaczego po prostu tego nie spróbujesz? W najgorszym przypadku poświęcasz trochę czasu na naukę, w najlepszym przypadku dostajesz dokładnie to, czego chcesz.
William Mariager
1
Tak, ale wyobrażam sobie, że tworzenie tego zajęłoby trochę czasu i nie lubię marnować czasu, dlatego zapytałem tutaj. =)
justanotherhobbyist
8
Jeśli się czegoś nauczysz, czas się nie zmarnuje. ;) Warto zastanowić się nad tym, że jeśli zmienisz język, poświęcisz czas na naukę nowego języka i naukę pracy w sieci w tym samym czasie, co oznacza znacznie więcej debugowania, aby dowiedzieć się, gdzie popełniłeś błąd. Jeśli będziesz trzymać się tego, co wiesz, najpierw nauczysz się pracy w sieci, a następnie możesz ją przenieść, jeśli okaże się nieefektywna, a następnym razem, gdy ktoś zadaje podobne pytanie, poznasz właściwą odpowiedź, ponieważ ją przetestowałeś.
William Mariager
1
To właściwie dobra uwaga
justanotherhobbyist

Odpowiedzi:

12

W przypadku gry w czasie rzeczywistym chcesz zminimalizować opóźnienia. Oto dwie wskazówki, jak to osiągnąć, z uwagami na temat PHP i węzła:

  1. Użyj WebSockets. Pozwalają na szybką dwustronną komunikację między serwerem a klientem. Używanie tutaj node.js ma tę zaletę, że można używać tego samego interfejsu API JavaScript na obu końcach potoku. Istnieje również wspaniały moduł socket.io dla node.js, który zapewnia rezerwowe technologie dla mniejszych przeglądarek, które nie obsługują WebSockets. Trochę googlując, wydaje się, że możesz także używać WebSockets z PHP, jeśli naprawdę chcesz.
  2. Nie angażuj bazy danych w dane krytyczne czasowo, takie jak współrzędne szybko poruszających się obiektów. Oznacza to zachowanie ich w pamięci, co nie jest szczególnie odpowiednie dla tradycyjnego modelu PHP, który uruchamia się raz dla każdego żądania apache (lub innego serwera WWW), ale możesz uruchomić aplikację PHP również jako samodzielny program. Sądzę jednak, że Node z rdzeniem V8 będzie szybszy niż PHP . To, czy jest to problem, zależy od tego, jak wymagająca jest Twoja gra i od tego, jak potężny jest serwer.

Osobiście uważam, że node.js jest bardzo łatwy do pobrania, a ponieważ i tak będziesz musiał napisać sporo kodu JavaScript, polecam wypróbowanie go. Przynajmniej rzuć okiem na samouczki dotyczące socket.io, aby przekonać się, jak proste jest skonfigurowanie kanału komunikacji w czasie rzeczywistym.

Tapio
źródło
+1 za punkt 2. Największym błędem, jaki możesz popełnić, jest oczekiwanie, że zapytania MySQL będą uruchamiane przy każdym zdarzeniu. Pomoże Ci wszystko, co możesz zrobić, aby przenieść dane gry z dysku twardego. Odniosłem sukces, wykorzystując w tym celu Memcached. Istnieją niewątpliwie inne sposoby.
DampeS8N
Tak, naprawdę chcę się nauczyć węzła, ale muszę jeszcze zacząć od cmd, największym błędem popełnianym przez programistów było utrudnienie dostępu. Przynajmniej teraz wersja systemu Windows jest dostarczana z instalatorem, może spróbować, jeśli znajdę dobry samouczek.
justanotherhobbyist
Węzeł wcale nie jest trudny do uruchomienia lub użycia. Tak, trudniejsze niż PHP, ale PHP płaci straszną cenę za swoją wygodę - konstrukcja, która pozwala go osadzać w Apache i domyślnie włączać wszędzie bez konfiguracji, powoduje również wiele problemów, które sprawiają, że PHP jest absolutnie i absolutnie najgorszym wyborem może stanowić backend do gry w czasie rzeczywistym. Węzeł, Python, Ruby, Java itp. Wymagają skonfigurowania serwera aplikacji, ale ten model pozwala na wysoce skalowalne, oparte na zdarzeniach przetwarzanie w pamięci, które jest dosłownie niemożliwe w PHP.
Sean Middleditch,
1

Wraz z odpowiedzią Tapio chciałbym zasugerować, aby (jeśli to możliwe) przesyłać dane wejściowe użytkownika (kliknięcia i klawiaturę) na serwer, a serwer i klient emulują grę. Każde N zaznaczenia powoduje, że klient prosi serwer o synchronizację, a serwer odpowiada wszystkimi informacjami potrzebnymi do renderowania gry, takimi jak zdrowie, przedmioty itp. Ma to na celu zapewnienie, że klient również nie zostanie zsynchronizowany wiele.

Oczywiście zarówno serwer, jak i klient będą musieli mieć dokładnie taką samą implementację gry, więc może to być nieco więcej pracy. Jeśli masz doskonałe implementacje zarówno na kliencie, jak i na serwerze, klient będzie musiał rzadziej synchronizować.

Zmniejszy to wysyłanie komunikatów klient / serwer, a tym samym opóźnienie. Pomogłoby to również zapobiec oszustwom.

Zakładając, że tworzysz tę grę w JavaScript, warto napisać zaplecze również w JavaScript, używając NodeJS. W ten sposób możesz ponownie wykorzystać implementację JavaScript swojej gry zarówno dla serwera, jak i klienta.

art0rz
źródło
0

Polecam naukę Nodejsa. Jeśli masz już Javascript, nie będzie to takie trudne. Szybko stworzyłem grę TRON Multiplayer z Nodejsem i to był mój pierwszy dzień korzystania z niej. (Och, a klient był płótnem HTML5; wysyłałem tylko kluczowe dane wejściowe, jak wspomniano w innych komentarzach).

Spójrz na moduł o nazwie nowjs. Powodzenia!

David Da Silva Contín
źródło