dimecres, 15 d’abril de 2009

Cas d'estudi: Gauntlet - Part Va: Red

Hui he estat preparant el codi de red. Per a la comunicació per red vaig a usar SDL_net (per als interessats, s'instala igual que SDL_image o SDL_mixer, segons explique al primer tutorial).

En principi he decidit que el servidor no siga més que un distribuidor d'ordres entre jugadors. O siga, si el jugador 1 comença a caminar cap a la dreta, envia un missatge al servidor dient-ho, i este redistribueix el missatge als demes jugadors, que mouràn al jugador convenientment. Aquesta aproximació es simplista i perillosa, pero es un començament.

En general, amb aquesta aproximació tot el proces que hi ha al joc ha de ser determinista. O siga, res de coses aleatòries, perque si cada comp decideix donar una aleatorietat diferent, les diferents versions en cada comp faran el joc injugable. En el cas de que s'introduïren elements aleatoris, deuria haver un "generador de nombres aleatoris en red" o similar, o sino, que siga el servidor el que genere aquesta aleatorietat. A més, problemes de sincronització, on un jugador pot estar uns pixels més lluny en un comp que en altre, poden dur a inconsistències. I es que fa falta un àrbitre que prenga les decisions importants, com per exemple si una bala a tocat a un personatge.

Tot açò ens du a que el servidor tindrà que estar "jugant" la partida també, tenint la seua versió al igual que els demes jugadors, i si hi ha algún event important, serà el servidor el que avisarà, mentre que els jugadors mai prendràn decisions sobre eixes coses. Per exemple, si una bala colisiona amb un personatge, el comp jugador no dirà ni mu. Serà el servidor el que, quan detecte aquesta situació, enviarà un missatge de colisió entre la bala i el personatge. Pot donar casos raros en que una bala que clarament ha tocat a un jugador en un comp, passe de llarg perque en el servidor no l'ha tocat, per diferencies de sincronia, pero al menys tots els comps tenen la mateixa versió dels fets i no es desincronitzen.

De totes formes, com ja he dit, al principi el servidor serà un distribuidor d'ordres i au. Per a joc en red local deuria ser suficient, amb latencies menors de 1ms (ara mateix el bucle de programa procesa ordres, com a molt, cada 10ms).

El que segurament implementaré prompte es el "paquet de sincronia". Durant el PFC vaig descobrir que les latencies havien baixat dràsticament desde que el vaig començar. Al final, fent que el servidor fora un redistribuidor i au funcionava be el 99'9% del temps. L'unic problema era si algún paquet UDP es perdia pel camí (lo qual ocorria una vegada de cada 10000 en Internet, i fent el burro amb coses descarregant i tal fa forçar la red. No ho vaig poder reproduïr en red local). Obviament, si se perd un paquet, encara que siga cada 10000, ja estem fotuts.

El que vaig fer es enviar un paquet de sincronia cada x segons. Aquest paquet contenia les dades actuals del jugador (x, y, acció actual...). Així em servia de ping, per a estar segur de que el comp i el servidor seguien vius, i per a restablir la sincronia en el cas de que s'haguera perdut (el que feia era, quan arrivaba un paquet de estos, forçar la posició i tal de cada jugador).

De totes formes, aquesta solució no arregla el fet de que el paquetet que es perda just siga el que diu que he disparat, amb lo qual ningú s'enteraria de que hi ha una bala per ahí. Crec que per a solventar-ho vaig fer que tot paquet enviat esperara una resposta. Ara mateix no recorde si al final també numerava els paquets, per a estar segur de que no es perdia ninguno. He de repasar-me el PFC.

No he acavat el codi, ni del servidor ni del jugador, així que este capitol encara no està tancat.

4 comentaris:

  1. No se si serà una peivada o que, pero intentant afinanr la sol·lució del problema de la bala se m'ocorre que el servidor conteste al client amb un OK quan li arribe el paquet i si no, no es produix el dispar.

    ResponElimina
  2. Lo mal d'això es que el jugador nota un retras entre que pulsa el boto i que eix la bala.

    No obstant, eixe mode de joc per red (el servidor actua de gateway absolut) també molaria provar-lo, en red local segurament no hi hauria ningún problema.

    ResponElimina
  3. Una pregunta sobre red local i disseny del joc:

    El joc permetrà que els jugadors deambulen pel mapa a la seua o estaran els dos dins de la pantalla? O dic pq en cas de ser lo segon, poc sentit te fer el joc per a red local quan lo millor sería jugar en el mateix comp i procurar que ane be per internet.

    Ho dic perque hui en dia, almenys en el meu cas, jugar en red local es el que menys es fa.

    Clar que si la idea es fer-ho per apendre i per practicar coses no hi ha cap pega.

    ResponElimina
  4. El joc restringirà sempre als jugadors en la pantalla, like feia el original.

    La idea es anar de menys a més. Primer que funcione dos jugadors en el mateix comp i joc. Després dos jugadors i el servidor executant-se en el mateix comp. Després tots en red local, cada un al seu comp. I per últim internet. Així es van vegent els problemes que vagen sorgint.

    Poc a poc ho vorem tot.

    ResponElimina