Codul rețelei

Scrierea corectă și corectă a codului de rețea este o sarcină simplă. Trebuie doar să înveți un pic și să încercați Winsock. Dar, de asemenea, trebuie să scrieți un cod rapid, în caz contrar plăcerea de a juca în rețea (sau, mai precis, modemul) nu va deveni specială. Este suficient să reamintim originalul Quake. Dacă cineva a încercat să joace această jucărie pe un modem, cred că nici o duzină de expresii non-literare nu au fost înmuiate :).







În acest caz, vorbim despre o conexiune client-server, atunci când clientul transmite datele despre acțiunile utilizatorului către server, iar serverul, după procesarea tuturor clienților, le trimite starea jocului.

În acest mod de comunicare există avantaje și dezavantaje.

Avantaje - dificultate inseala, dar clientul nu are în mod necesar o configurație de calculator fantezie, deoarece este necesar doar să ia datele pe server care sa schimbat în lumea jocului și ceea ce este reprezentat pe ecran. În plus, o sincronizare specială pentru a se asigura că clienții au stare identică a lumii de joc (de exemplu, Doom nu a fost construit pe o tehnologie client-server, fiecare calculator calculează foarte diferite opțiuni de joc pe baza unui generator de numere aleatorii, și a avut totul să-l sincronizați).

Dar, există dezavantaje semnificative, care sunt aproape invizibile atunci când se joacă în rețeaua locală, dar se manifestă foarte puternic atunci când se joacă pe un modem. Cel mai important dezavantaj este Ping, nu el însuși;), dar valoarea sa ridicată. Ping este timpul pentru care pachetul de la client atinge serverul, plus timpul de răspuns al serverului, plus timpul necesar pachetului pentru a trece de la server la client. În rețeaua locală, valoarea sa se situează de obicei între 5 și 30 msec. Când joci același modem, valoarea ping-ului poate fi de la 50 (bine, este doar condițiile perfecte) și la infinit. Presupunând că conexiunea modemului este acceptabilă, valoarea lui Ping va depinde numai de "curbura" codului de rețea și de starea lumii jocului (modificări în diverși parametri ai elementelor de joc).

Astfel, optimizarea codului de rețea sau, mai exact, optimizarea dimensiunii datelor transmise este o sarcină foarte serioasă și complexă.

Dar, la început, bineînțeles, vom analiza modul în care funcționează toate acestea și apoi vom proceda la optimizare.







Deci, avem conexiunea prin Winsock (puteți, desigur, utilizați DirectPlay, dar cu atât mai puțin avem intermediari, cu atât mai repede va funcționa, nu-i așa?), Protocolul UDP (conexiune TCP, în acest caz, puteți utiliza numai în rețeaua locală pentru că unul dintre avantajele TCP - 100% de livrare de pachete - în acest caz, se transformă într-un mare dezavantaj, pentru că în cazul în care pachetul, acesta nu va fi afișat trimis cu succes din nou la starea de joc s-au schimbat)!.

Exemplele sunt construite folosind codul open source al Quake2. (Ca o deviere de la subiect, vreau sa spun o opinie personala despre acest cod - codul este scris "destul de clar" si optim, fara glitches si, in general, este usor de citit). Ar fi, de asemenea, frumos dacă te uiți periodic în documentația pentru winsock. Este util să citiți mai întâi teoria și apoi să luați în considerare acest lucru în practică.

După ce ați executat cu succes aceste acțiuni, biblioteca Winsock este gata să vă servească :).

Acum, să scriem o metodă pentru inițializarea socketurilor.

Prizele nu pot fi mai mari de 2 ani. Unul pentru server, al doilea pentru client (pentru un server dedicat, nu este necesar).

Puteți face două variabile, server_socket și client_socket, și este posibil, așa cum se face în quake2, de a crea o serie de 2-elemente și un fișier antet pentru a descrie recenzorul:

În fișierul principal vom descrie o matrice

static int ip_sockets [] =; // server IP prize de client

Să scriem o metodă generală pentru inițializarea socketurilor, care va fi apelată atunci când clientul sau serverul este inițializat inițial.

Metoda folosește o altă metodă mai specifică de inițializare a mufelor pe protocolul IP. De asemenea, puteți efectua inițializarea pentru protocolul IPX.

Ei bine, am scris metodele de inițializare a rețelei. Rămâne foarte puțin - scrieți metode de trimitere / primire a pachetelor și metode de lucru cu un client local.

Pentru aceste metode, este necesară o descriere a unor structuri.

Metoda de trimitere a pachetului:

Metoda de primire a pachetului:

Descrierea buffer-ului de clasă:

Această clasă este concepută pentru a lucra cu o varietate de tipuri de date de diferite tipuri.

Rămâne doar să înțelegem modul în care datele sunt transferate între clientul local și server.

Faceți o imitație a lucrării Winsock. Winsock putem trimite mai multe pachete la un alt calculator, atâta timp cât le va lua, adică, este necesar să se creeze unele dintre toate pachetele. În Quake2, acest lucru este implementat într-un mod destul de simplu și original - prin matricea "cu buclă". Puteți face acest lucru folosind bufferul de clasă STL +. Dar, așa cum am spus mai devreme, cod quake2 este scris destul de optim, în plus, nu avem nevoie de tehnici de clasă tampon, avem nevoie de o matrice simplă, iar dimensiunile sale variabile, astfel încât, de exemplu, utilizați codul original.

Ei bine, acum metodele în sine:

Aceasta a fost prima parte a articolului. Aici a fost descris un driver de nivel scăzut pentru lucrul cu rețeaua. Direct, practic nu este utilizat de motor. În a doua parte, va fi descrisă o clasă cu care motorul va funcționa direct. Acesta va implementa mai multe lucruri interesante, dintre care cea mai importantă este posibilitatea de a furniza 100% date "importante" (date fiabile). Dar va fi mai târziu.







Articole similare

Trimiteți-le prietenilor: