Autor Wątek: Dodawanie warstwy sieciowej do gry  (Przeczytany 1444 razy)

Offline Apoptyzm

  • Użytkownik

# Październik 13, 2010, 13:47:48
Witam,
mam prostą grę, do której teraz muszę dorobić warstwę sieciową.
Bazowo komunikacje sieciową(sockety itd) planuje w osobnym wątku, który odbierałby dane interpretował i zapisywał w jakims statycznym globalnym kontenerze(z mutexem), z którego gra mogłaby odczytywać dane(update przeciwników itd) i rozkazy(odpytaj DB o cośtam).

Teraz zastanawiam się czy są jakieś lepsze pomysły od tego na zintegrowanie wszystkiego.

Innym pomysłem byłoby zapisanie otrzymanych informacji z sieci w klasie która rozsyłałaby informacje do odpowiednich klas na zasadzie obserwatora/sygnałów, ale to pewnie nie wypali w przypadku gdy chciałbym  np. nadpisać pozycje przeciwnika, w momencie w którym ta pozycja jest używana do obliczeń/rysowania. Synchronizowanie połowy klas gry odpada raczej xD

Znacie jakieś prostsze efektywne podejście?
--edit--
mówimy o aplikacji w c++

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Październik 13, 2010, 13:51:55
Na pewno poczytaj o "non-blocking sockets". Odpadnie Ci zabawa w wielowątkowość i zbędne semafory. Jeżeli gra jest z gatunku zręcznościowych, to przygotuj się na dość sporo zabawy, bo to jest temat nietrywialny. :)

Offline Apoptyzm

  • Użytkownik

# Październik 13, 2010, 14:08:21
Wiem ze istnieją non-blocking sockety chociaż nie widze możliwości np. zmierzenia laga w przypadku jednowątkowym z tymi socketami. Zakładając, że odczytuje stan 60razy/sekunde to ping zawsze bedzie wielokrotnością czasu pomiedzy odczytami. Nie widziałem możliwości zapisu dokładnie czasu otrzymania pakietu.

Można powiedzieć że gra jest zręcznościowa jesli pytasz o wydajność i precyzje ; )


Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Październik 13, 2010, 14:16:44
Cytuj
Wiem ze istnieją non-blocking sockety chociaż nie widze możliwości np. zmierzenia laga w przypadku jednowątkowym z tymi socketami. Zakładając, że odczytuje stan 60razy/sekunde to ping zawsze bedzie wielokrotnością czasu pomiedzy odczytami. Nie widziałem możliwości zapisu dokładnie czasu otrzymania pakietu.
No fakt, jest to pewna wada, ale w praktyce nie powinno być problemem.

Cytuj
Można powiedzieć że gra jest zręcznościowa jesli pytasz o wydajność i precyzje ; )
Głównie chodzi o wymagany czas rekacji gracza.

Offline lmmilewski

  • Użytkownik
    • Łukasz Milewski - devblog

# Październik 13, 2010, 22:06:41
Ja (już drugi raz dzisiaj) proponuję boost::asio. Ta biblioteka załatwia Twój problem w całości - mówię o asynchronicznej obsłudze sieci.

BTW. Wnioskuję z Twojej wypowiedzi, że nie masz wiele doświadczenia w programowaniu sieciowym - proponuję żebyś napisał coś, do czego wystarczy Ci TCP (np. FPS raczej odpada).

Offline Apoptyzm

  • Użytkownik

# Październik 14, 2010, 14:18:23
Dzięki za podpowiedzi.

Jak spojrzałem na tą asio to i tak musiałbym się bawić w synchronizacje danych chyba.
Niby asio ma tam jakiś locking, ale nie doczytam się czego to dotyczy, nigdzie tez nie ma nic o pisaniu własnych completion handlers, które się zajmują tą synchronizacją.
W końcu nawet jeśli asio wywołuje asynchronicznie metode zapisania gdzies otrzymanych danych, to w tym samym momencie gra może próbować je odczytać albo modyfikować i może być kleks.

Więc non-blocking socket na osobnym wątku dałby prawie to samo, tylko będzie wyglądał bardziej łopatologicznie.


Offline micze

  • Użytkownik

# Październik 14, 2010, 14:21:56
Przywalę z grubej rury - CORBA. Stosunkowo ciężko się tego uczy ale jak już będziesz obcykany to naprawdę fajnie się w tym pisze.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Październik 14, 2010, 14:33:35
Cytuj
Więc non-blocking socket na osobnym wątku dałby prawie to samo, tylko będzie wyglądał bardziej łopatologicznie.
Główna zaleta NBS polega właśnie na tym, że nie wymaga osobnego wątku. :)

Offline Apoptyzm

  • Użytkownik

# Październik 14, 2010, 14:54:42
Cytuj
Więc non-blocking socket na osobnym wątku dałby prawie to samo, tylko będzie wyglądał bardziej łopatologicznie.
Główna zaleta NBS polega właśnie na tym, że nie wymaga osobnego wątku. :)
Tak wiem, tylko asio nie wygląda jak NBS bez wątków. Tylko dla porównania tego użyłem.


Offline lmmilewski

  • Użytkownik
    • Łukasz Milewski - devblog

# Październik 15, 2010, 00:26:53
Jak spojrzałem na tą asio to i tak musiałbym się bawić w synchronizacje danych chyba.
To źle spojrzałeś. http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/examples.html z wyjątkiem HTTP Server 3 wszystko jest bez wątków (a techniki z HTTP Server 3 raczej nie potrzebujesz).

Więc non-blocking socket na osobnym wątku dałby prawie to samo, tylko będzie wyglądał bardziej łopatologicznie.
Albo non-blocking albo na osobnym wątku.