Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.

  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] Przesylanie danych o graczu miedzy serweramiOptymalność użycia sockets

nie chce mi się tagować

Najlepsza odpowiedź GwynBleidD, 10.06.2014 11:55

Przy założeniu, że wszystko przesyłasz do jednego mastera (alfa) i on decyduje o tym, który serwer co dostanie to dobrze by było, żeby ten alfa nic innego nie robił, tylko rozsyłał informacje, bo przy 10ciu pełnych serwerach faktycznie może go to przytłoczyć trochę. Czyli na serwerze alfa nie masz graczy, wykrajasz do zera rzeczy związane z ich obsługą i umieszczasz tylko przesyłanie i zarządzanie danymi. Pytanie tylko po co ten serwer ma być nadal serwerem CSa?

W takim wypadku najlepiej by było napisać własny serwer rozsyłający dane (dla przykładu w pythonie. Używając asyncore jest to właściwie klepnięcie jednej niezbyt skomplikowanej klasy). Dobrym pomysłem by było również odwrócenie logiki, tj zamiast serwera alfa stawiasz serwer przechowujący dane (redis, mongodb czy coś w ten deseń... sql się do tego nie nadaje raczej przy takim ruchu danych "jednorazowych") i każdy serwer łączy się z nim i umieszcza dane oraz pobiera sobie potrzebne mu dane umieszczone tam przez inne serwery. Wtedy decyzja o przepływie danych spada na konkretne serwery, nie zarządza tym jeden "master".

I jeśli chodzi o wydajność serwerów nie-master, ciężko powiedzieć... za dużo czynników zewnętrznych na to może wpłynąć, takich jak jakość hostingu na którym stoi dany serwer i konfiguracja jego firewalla. Jeśli wszystko stoi na maszynach w jednej "podsieci" to jest to na pewno do ogarnięcia dla 15-20 pełnych serwerów nawet.

Ale muszę przyznać, że wysoko sobie poprzeczkę postawiłeś :) Przejdź do postu


  • Zamknięty Temat jest zamknięty
14 odpowiedzi w tym temacie

#1 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 08.06.2014 20:20

Witam, aktualnie jestem w trakcie pisania dosyć wielkiego mod'a ale muszę być świadom czy nie pisze bez sensu. Dlatego mam do was pytanie ale najpierw was wtajemniczę. (Uwaga dalej są informacje ściśle tajne) Mod ma możliwość wysyłania danych pośrednio między serwerami za pomocą socket'ów (oczywiście dane o graczu tzn. położenie,vector,kierunek wzroku,itd). To już zrobione ale nasuwa mi się pytanie ile takich graczy mógł by wytrzymać serwer (zakładamy że mam 10 serwerów każdy 32 sloty, 0 hltv, dosyć wydajne maszyny). Oczywiście wysyłam po to dane o graczy by na innym serwerze widzieć jego poczynania (taki fake (byt ale nie player) gracz co nie zabiera slotów :D

 

Testowałem przy 2 graczach i wszystko pięknie śmiga ale nwm ilu coś takiego wytrzyma. Dlatego proszę o info ;D


  • +
  • -
  • 2
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#2 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 08.06.2014 21:54

Nawet i 10000... albo i tylko jednego... Zależy jak często wysyłasz dane i jak dużo ich jest. Jak robisz to nieudolnie, np wysyłasz plik XML co 10ms w którym dodatkowo dorzucasz w base64 model gracza to sam się domyśl co się stanie. Jak wysyłasz dane w postaci ładnej paczki to możesz i co 1 ms wysyłać (chociaż przy takiej intensywności większość z nich nie dotrze).

Dodatkowo można upchnąć dane o kilku graczach do jednej "paczki", co oszczędzi z pewnością trochę transferu.
  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#3 BlackPerfum

    Pseudo interakcja??

  • Autor tematu
  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 08.06.2014 22:45

Optymalność przesyłu jest dosyć duża. Żadnych tekstów, dane lecą pięknie spakowane w paczuszkę, o całym serwerze nie tylko graczach. No niestety z tymi 10000 graczami to ja bym nie przesadzał. Dane są aktualizowane co 1 ms. Tylko że to działa na troszkę specyficznej zasadzie bo wszystko wysyłam na jeden serwer i on zarządza czy ma być coś przesłane do innego. Dlaczego tak? Bo inaczej każdy serwer musiał by do każdego wysyłać dane o graczach a tak każdy wysyła do jednego (+ inne jeśli ten główny(pseudo) im na to pozwoli). Dane takie jak nazwa modelu/nazwa gracza/ i inne stałe dane gracza (u mnie są one stałe) wysyłane są tylko raz. 

 

Dodam jeszcze że zrobiłem ograniczenie w sposobie pokazywania takich graczy tzn. jeśli gracz jest z serwera "alfa" a inny gracz z serwera "beta" nie ma go w polu widzenia to nie tworze jego bytu (tylko przechowuje jego dane) + jeśli straci go z pola widzenia to usuwam byt (oczywiście z opóźnieniem). Dla zmniejszenia obciążenia + głupie ograniczenie bytów na mapie. 

 

Prosił bym o sprecyzowanie. Tzn. główne założenie polega na tym by 100-500 graczy było na serwerze ale no niestety coś wątpie by tyle wytrzymało łącze + serwery dlatego czy coś takiego jest realne bez lagów ??

 

Jeszcze powiem taką ciekawostkę związaną z modem. Cały mod jest bardzo związany ze starym awatarem benia. Przepraszam benio namówili mnie  :

(Aktualny stan projektu to 10% z części nr.1 na 100)


  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#4 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6034
Godlike

  • Postów:10832
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 09.06.2014 10:23

Więcej informacji kodu wtedy będziemy mogli ocenić efektywność przesyłania ;) ( i statystyk najlepiej )


  • +
  • -
  • 0

#5 BlackPerfum

    Pseudo interakcja??

  • Autor tematu
  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 09.06.2014 13:56

Zakładając że na 10 serwerach jest po 32 graczy to:

 

Co 1 ms wysyłam do serwera alfa wszystkie dane (około 3 kb na serwer)

Czyli do serwera alfa dochodzi 27kb co 1 ms i on zarządza czy dany serwer może wysłać dane jakiemuś innemu serwerowi. Serwer alfa wysyła tylko te 3 kb o danych + parę bajtów o możliwości przesyłu danych.

 

Czyli gdyby gracze z każdego serwera na siebie nie wpływali to: każdy serwer (9 jest ich) wysyła 3 kb do serwera alfa

a gdyby wszyscy gracze musieli by się widzieć to: każdy serwer wysyła do każdego dane tzn. każdy serwer wysyła 3kb i odbiera 27kb co 1 ms (320 graczy w jednym miejscu normalnie coś nie realnego :D)

 

 


  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#6 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 10.06.2014 11:55   Najlepsza odpowiedź

Przy założeniu, że wszystko przesyłasz do jednego mastera (alfa) i on decyduje o tym, który serwer co dostanie to dobrze by było, żeby ten alfa nic innego nie robił, tylko rozsyłał informacje, bo przy 10ciu pełnych serwerach faktycznie może go to przytłoczyć trochę. Czyli na serwerze alfa nie masz graczy, wykrajasz do zera rzeczy związane z ich obsługą i umieszczasz tylko przesyłanie i zarządzanie danymi. Pytanie tylko po co ten serwer ma być nadal serwerem CSa?

W takim wypadku najlepiej by było napisać własny serwer rozsyłający dane (dla przykładu w pythonie. Używając asyncore jest to właściwie klepnięcie jednej niezbyt skomplikowanej klasy). Dobrym pomysłem by było również odwrócenie logiki, tj zamiast serwera alfa stawiasz serwer przechowujący dane (redis, mongodb czy coś w ten deseń... sql się do tego nie nadaje raczej przy takim ruchu danych "jednorazowych") i każdy serwer łączy się z nim i umieszcza dane oraz pobiera sobie potrzebne mu dane umieszczone tam przez inne serwery. Wtedy decyzja o przepływie danych spada na konkretne serwery, nie zarządza tym jeden "master".

I jeśli chodzi o wydajność serwerów nie-master, ciężko powiedzieć... za dużo czynników zewnętrznych na to może wpłynąć, takich jak jakość hostingu na którym stoi dany serwer i konfiguracja jego firewalla. Jeśli wszystko stoi na maszynach w jednej "podsieci" to jest to na pewno do ogarnięcia dla 15-20 pełnych serwerów nawet.

Ale muszę przyznać, że wysoko sobie poprzeczkę postawiłeś :)
  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#7 BlackPerfum

    Pseudo interakcja??

  • Autor tematu
  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 10.06.2014 17:38

Pytanie tylko po co ten serwer ma być nadal serwerem CSa?

Założeniu projektu miało być takie iż wszystko będzie na serwerach cs'a. No fajny pomysł by master serwer nie był serwerem cs'a ale jest pewien mały szkopuł a dokładnie to nie bedę miał zbytnio jak otworzyć (w prosty sposó B) mapy na takim serwerze (aby porównywać dane graczy by np. pozwolić jakiemuś serwerowi wyświetlić gracza z innego serwera) ale to nie duży problem :D Jak skończę prace nad mapą to zapiszę sobie położenia ścian w oddzielnym pliku (najprawdopodobniej .txt ;D)

 

 

 

Dobrym pomysłem by było również odwrócenie logiki, tj zamiast serwera alfa stawiasz serwer przechowujący dane (redis, mongodb czy coś w ten deseń... sql się do tego nie nadaje raczej przy takim ruchu danych "jednorazowych") i każdy serwer łączy się z nim i umieszcza dane oraz pobiera sobie potrzebne mu dane umieszczone tam przez inne serwery. Wtedy decyzja o przepływie danych spada na konkretne serwery, nie zarządza tym jeden "master"

No właśnie nie do końca. Z takich o to powodów:

 

• każdy serwer wysyłał by dużo więcej danych (a serwer z danymi to już kosmos (przy 10 serwerach 243 kb co 1 ms))

• każdy serwer musiał by samemu sprawdzać czy może wyświetlić danego gracza (przy 10 serwerach każdy 32 sloty serwer musiał by 288*32 sprawdzić czy pokazać danego gracza no nie fajnie, nie fajnie zwłaszcza że na tym serwerze są ludzie)

 

 

Ale muszę przyznać, że wysoko sobie poprzeczkę postawiłeś

Tak, porwałem się z motyką na słońce (zawsze chciałem to powiedzieć)

 

 

Mam jeszcze takie pytanie:

Czy klient/serwer cs ma jakieś ograniczenia co do wyświetlania modeli naraz?? Nie chodzi mi o cl_minmodels itd tylko o jakieś własne blokady

 

Jeśli macie jakieś pomysły co do pakowania danych/sposobem wysyłania/sposobem zarządzania danymi to piszcie :D


  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#8 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 10.06.2014 22:03

Parsowanie pliku bsp to nie jest jakiś specjalny problem, więc pozycje ścian na mapach da się odczytać.

Co do samego projektu - mam nadzieję, że nie szykujesz tego w amxx, tylko jako moduł do Metamoda? Bo to byłby koszmar robić to w amxx (no i faktycznie wydajnościowo mogła by być wtedy kicha).
  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#9 BlackPerfum

    Pseudo interakcja??

  • Autor tematu
  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 11.06.2014 08:35

Parsowanie pliku bsp to nie jest jakiś specjalny problem, więc pozycje ścian na mapach da się odczytać

Mapa będzie wczytywana raz dziennie ( aby backupa zrobić ) Dlatego to nie jest problem

Co do samego projektu - mam nadzieję, że nie szykujesz tego w amxx, tylko jako moduł do Metamoda? Bo to byłby koszmar robić to w amxx (no i faktycznie wydajnościowo mogła by być wtedy kicha).

Właśnie nie wiem czy pod metamoda :D
Miło by było gdyby to było na poziomie metamoda (nie pod niego ) ale nwm ile będę miał czasu :D
  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#10 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 11.06.2014 12:19

Na poziomie metamoda, tj zamiast metamoda? Bo obok raczej się nie da ;) Metamod właśnie powstał po to, aby można było pod HLDS podpiąć więcej niż jeden plugin. Tj możesz do swojego pluginu dorobić interfejs do którego podepniesz metamoda, ale to jest niepotrzebna zabawa moim zdaniem...

No chyba, że chcesz stworzyć nowy mod do hl ;)
  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#11 BlackPerfum

    Pseudo interakcja??

  • Autor tematu
  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 11.06.2014 12:49

Na poziomie metamoda, tj zamiast metamoda?

Tak lub

 

 

 

No chyba, że chcesz stworzyć nowy mod do hl

Właśnie o to mi chodziło. Tylko pewnie byłby z tym problem :/

 

 

Dlatgo albo zamiast metamoda albo pod metamoda  a to już mi różnicy nie robi

No może nawet zamiast metamoda będę miał większe możliwości :D


  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#12 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6034
Godlike

  • Postów:10832
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 11.06.2014 12:59

Dlatgo albo zamiast metamoda albo pod metamoda  a to już mi różnicy nie robi

 

no różnice to robi ;)

 

No może nawet zamiast metamoda będę miał większe możliwości :D

 

są te same :P


  • +
  • -
  • 0

#13 BlackPerfum

    Pseudo interakcja??

  • Autor tematu
  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 11.06.2014 13:07

Jakoś w pisaniu czegoś zamiast metamoda i pod niego nie widzę dużej różnicy (no w kodzie tak ale nie w trudności/czasie wykonania)

 

No nie do końca bo pisząc zamiast metamoda nie musiał bym używać biblioteki cs'a jedynie przepisał bym jej strukturę aby gracze poprawnie działali :D


Użytkownik BlackPerfum edytował ten post 11.06.2014 13:09

  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#14 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 11.06.2014 13:57

To w takim razie pisałbyś zamiast cstrike :) Czyli de facto stworzyłbyś nowy mod.

Krótkie naprecyzowanie jak to właściwie wszystko jest zbudowane:

Half-Life po uruchomieniu odpala mod, w naszym przypadku cstrike. Mod ten jest uruchamiany poprzez załadowanie biblioteki z pliku liblist.gam. Gdy instalujemy metamoda, podmieniamy tenże wpis w liblist.gam, ale to nie oznacza, że biblioteki cstrike się nie ładują wcale :) Ładują się, bo metamod je automatycznie załaduje, jednak najpierw sam siebie załaduje. Tak samo działają wszystkie inne dodatki do CSa, które nie są pisane pod metamoda (dla przykładu różnego rodzaju boty). Jest tu jednak pewne ograniczenie, mianowicie możemy odpalić tylko jeden taki dodatek, bo ten dodatek nie wie, że ma załadować po sobie jakiś inny, tylko załaduje cstrike. No chyba, że twórca takiego dodatku nie był egoistą i pomyślał o tym, ale i tak się to robi niewygodne. Dlatego właśnie powstał metamod :)

No i jak wiadomo AMXX jest dodatkiem do metamoda, a pluginy dodatkami do AMXX, więc mamy piękne drzewko zależności ;) A pisanie pluginu do metamoda wcale wiele się nie różni od pisania pluginu zamiast metamoda, więc po cholerę i sobie i innym utrudniać życie i pisać zamiast metamoda?

Z tworzeniem nowego modu (zamiast cstrike) jest już trudniej. Oczywiście można bazować na cstrike, ale pamiętaj, że jeśli zmienisz coś zbytnio w protokole to będziesz musiał wydać własnego klienta do tego moda, bo CS po prostu się z serwerem nie połączy :)
  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#15 BlackPerfum

    Pseudo interakcja??

  • Autor tematu
  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 11.06.2014 14:37

Z tworzeniem nowego modu (zamiast cstrike) jest już trudniej. Oczywiście można bazować na cstrike, ale pamiętaj, że jeśli zmienisz coś zbytnio w protokole to będziesz musiał wydać własnego klienta do tego moda, bo CS po prostu się z serwerem nie połączy

Właśnie dlatego jeśli bym pisał moda ( zamiast metamoda ) to bym nie ładował moda cstrike a jedynie rzeczy odpowiadające za łączenie się graczy i to jest różnica między pisaniem pod metamoda a zamiast niego

Przekonaliście mnie, przepiszę mój kod na kod pod metamoda :D
Jeśli faktycznie jedyną różnicą między pisaniem pod metamoda a zamiast metamoda to to iż jeśli pisze się zamiast metamoda to nie trzeba ładować cs'a to napiszę pod metamoda
  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika





Również z jednym lub większą ilością słów kluczowych: nie chce mi się tagować

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych