Cum se scrie un server de jocuri

Joc multiplayer online - client-server, p2p, tcp / updatare pachete, grafice
Descrierea procesului și stabilirea sarcinii:

1) fiecare jucător efectuează o acțiune asupra clientului său și trebuie să informeze jucătorii despre monștri și obiecte de joc într-o anumită rază.






2) Jucătorul trebuie să vadă obiecte 3D și monștri numai în raza definită.
3) Serverul execută acțiuni pentru lume și monștri și notifică tuturor jucătorilor sau jucătorilor despre el în raza definită din obiect.
4) monștrii de jucători și serverul care efectuează acțiunile din mesaje sau pachete
5) formatul unui mesaj de joc sau al unui pachet de pseudocod

[Player1, player2, server] [time_stamp] [client / server] [geo_location] [game_map_location] [net_key] [player_id] [visible_radius] -
[player1, player2, server] În cazul în care fiecare element este un obiect serializat
jucător [
acțiuni [[hit, player2, fireball], [rulați, vector], [rotiți, rază]],
jucător [param1, param2],
articole [element1, element2],
mesaj [șir, chat],
gruops [clan, petrecere],
timp [time_stamp]
]

Dacă trimiteți mesaje de la clienți către server și formează un pachet mare.

1) Sincronizarea jucătorului
2) Sincronizarea server-client
3) tcp / updatare rata de bit redusă, client-server cu rate scăzute de transfer
5) Doar serverul ar trebui să știe despre toate pachetele,
6) Jucătorii se află la distanțe diferite din punct de vedere geografic - ceea ce reduce rata de transmisie
7) Este necesar să trimiteți pachete numai la obiectele vecine
8) Pachetele pot fi pierdute, pachetele pot fi schimbate

Soluții opționale la nivel de joc:
1) Matricea bidimensională [] [] care corespunde hărții fizice a lumii jocurilor
2) Adăugarea obiectelor de joc în acest matrice
3) Adăugarea unei raze de vizibilitate pentru fiecare obiect care poate trimite pachete
4) Obiectul trimite pachete numai la obiecte care se află într-o anumită rază de la ea
6) Sunt formate grupuri de obiecte
5) Unul dintre obiecte este desemnat ca principal
6) Fiecare grup de obiecte trimite fiecare pachet
7) Se creează un pachet de referință
8) Obiectul principal al grupului trimite un pachet de referință tuturor

Soluție la nivel de rețea și server:
1) Se realizează o hartă a lumii și se creează o matrice bidimensională, celula conține informații despre regiunea [țara] [orașul] și despre toți clienții din regiune
2) În aceste puncte este construit un grafic și se calculează cele mai scurte căi spre fiecare punct
3) În fiecare regiune, mai mulți clienți sunt selectați cu cea mai mare viteză
4) Unul dintre clienți devine un server de transfer de date pentru toți cei din regiune
5) Serverele regionale transmit mesajele de-a lungul lanțului și de-a lungul celei mai scurte căi între ei și server

1) Clienții trimit mesaje la expirarea timpului
2) Se creează un fir pe server care generează cozi de mesaje
3) Serverul principal creează, de asemenea, o coadă de mesaje

Rețineți că libera circulație este disponibilă în jocuri cu puțin online.
În jocurile online mari, cum ar fi linia / du-te, nu aveți mișcare liberă, dar comanda "rulați la coordonatele x, y", atacați inamicul z
prin urmare, nu trebuie transmise prea multe informații despre fiecare jucător.







Ping nu este deloc - serverul roteste o buclă de evenimente interne care procesează toate acțiunile la o anumită rată.
Timpul minim S este ales, pentru care pot avea loc anumite acțiuni în lumea jocurilor. Toate acțiunile se bazează pe acest interval de timp (vraja exprimată 3 secunde, mergeți pe orizontală 1 pas 1S, executați 3 pași 1S)

Deoarece pachetul a venit de la jucator cu echipa, serverul a inceput sa-l execute. Iar clientului este posibil să se deseneze mai ușor acțiunile.

În general, aveți întrebări de un astfel de nivel care merită probabil să studieze lucruri mai simple. scrie pentru a începe un chat, sau un simplu MUD

Da, mai întâi trebuie să scrieți un chat, a dat un link interesant pe tema www.gabrielgambetta.com/fpm_live.html Vseravno ce ar trebui să fie algoritmul de sincronizare. Am apăsat pentru a alerga până la punctul x clientul a trecut prin ea, dar la un moment dat mi-a schimbat mintea și m-am întors. În acest moment, cu un alt jucător pe client, el continuă să ruleze în aceeași direcție.
De exemplu, data viitoare vom verifica dacă rulează în aceeași direcție.

Padaboo. Și se întâmplă când este podgivaet.
Însă confundați numărul de mesaje care trebuie trimise.
Jucătorul trimite acțiunile la server.
Pot fi trimise mai multe acțiuni pentru un singur pachet. Serverul trimite jucătorilor imediat o coadă de acțiuni, și nu pentru fiecare jucător separat.
Creștem durata tick-ului minim - totul devine mai ușor odată.
În majoritatea MUD-urilor, bifarea durează o jumătate de secundă. E destul.

Cred că ai luat o sarcină prea complicată pentru frunte.

În orice caz, serverul este principalul optimizator.
El trebuie să decidă ce jucător să trimită. Restricționați cererile pe distanțe. Dacă jucătorul A nu poate face nimic jucătorului B, atunci îi trimite informații despre ele sau nu în mod necesar, sau poți să faci de 10 ori mai puțin. Vino mai aproape - vor fi mai multe detalii.

Periodic s-ar sosi sincronizarea pachetelor cu informații mai complete, dar mai ales delta între trecut și cea actuală.

UDP este adesea folosit

În general, o mulțime de nuanțe. Chiar vrei să faci această decizie imediat?
100 de jucători sunt destul de posibili și în sincronizare pentru a transmite, decalajul grav începe în regiune de la 500 și mai mult într-o singură locație.

Dacă ceva de genul cutremur, în cazul în care milisecunde sunt critice, există câteva zeci și cum să nu optimizați ping-ul critic de la player la server și cu toate <30ms не сделать.

Serghei. Da serios și doresc să înceapă cu mesaje de testare și de sincronizare pentru atunci când este înfășurată la mecanica jocului va fi chiar mai greu.
Nu, vreau să fac o dată că ceva serios - locația nu este foarte bună, lumea cea mai bună este cea mai bună.
Linia de jos este că, dacă trimiteți de multe ori pachete foarte detaliate, va fi ideal, dar vor exista jurnale cu o creștere a numărului de utilizatori.
dacă rar trimiteți pachete, atunci clientul va trebui să ghicească ce va face jucătorul înainte de sosirea pachetului următor și va fi mai dificil de sincronizat.
Jucătorul a fugit 400 de metri, iar următorul pachet îl aruncă înapoi și se desfășoară la 30 de grade.

Cu locațiile: este bine dacă este unul mare, iar tranzițiile dintre locații sunt făcute sub formă de "ușile" și "peșterile", astfel încât în ​​momentul de tranziție jucătorii nu s-ar vedea unul pe celălalt.
Și dacă nu există tranziții - atunci jucătorii nu se pot vedea reciproc în locații diferite doar la nivelul codului de aplicație, pe client, de asemenea.

De exemplu, un personaj rulează de-a lungul drumului și există o schimbare a locației (vizibil în același loc)

"Nu, vreau să fac ceva serios odată - locația nu este foarte bună, lumea este cea mai bună".
Linia de jos este că te gândești la stereotipuri.

Locația nu este neapărat o schimbare de locație, este, de asemenea, o locație.
Calculați DISTANCE între jucători și clientul specific pentru a trimite ceea ce privește locația sa actuală și obiectele interactive la o anumită distanță X de la el. Puteți chiar să vă asigurați că această distanță X nu este statică și, de exemplu, scade automat dacă există mai multe obiecte în apropiere. Aceasta este, "în oraș", de exemplu, 20 de metri, în mediul rural 100 de metri. Adăugați excepții la acele obiecte care se conectează direct cu el sau au contactat ultimele xx secunde

În general, IMHO aveți un proiect mare, în general, fără experiența unei astfel de activități.
Ca urmare, există o probabilitate de aproximativ 95%, proiectul rămâne neterminat ca să se obțină cel puțin o primă versiune de lucru veți obține un timp foarte lung, dar fara succes notabil, motivația scade și totul va rămâne pe hârtie.







Articole similare

Trimiteți-le prietenilor: