¿Cómo permite que se escriba el código de red en las etapas posteriores del desarrollo?

12

Actualmente estoy en el progreso inicial de escribir un juego que eventualmente querré mejorar en la mayoría de los aspectos.
¿Cómo puedo omitir la escritura de código de red y dejarlo implementado con bastante facilidad, es decir, no tener que reescribir todo el juego solo para agregarlo?
¿Qué debo tener en cuenta?

Tengo un patrón de componentes donde separo la física / detección de colisión, la lógica del juego, los tipos de datos y la animación / representación entre sí.
¿Cómo escribo un cliente y un servidor que no tienen ningún código de red implementado pero que pueden probarse localmente?
¿Qué debo hacer en el cliente y qué debo hacer en el servidor? ¿Debo fingir que tengo el código de red terminado y enviar mensajes entre el servidor y el cliente y dar cuenta de los retrasos, etc. aunque no haya ninguno?

Editar: está planeado ser un juego de rol de arriba hacia abajo. El modo multijugador simple donde alojas un servidor para tus amigos es lo que estoy pensando, por lo que hacer trampa no es un gran problema (¿a quién le gustaría jugar con amigos tramposos?). Aún así, me gustaría ir con un enfoque "El servidor siempre tiene la razón".

Edición 2: supongo que estoy buscando algunos indicadores sobre cómo debería ser mi mentalidad. ¿Cómo debo manejar la entrada del teclado, la animación, etc., en lugar de simplemente aplicar cada efecto / cambio al instante? Hmmm, es posible que necesite leer correctamente en la red antes de ir a cualquier parte, después de todo, que era lo que esperaba escapar haciendo un esqueleto de red de algún tipo que pudiera funcionar localmente.

Ghork
fuente
Eso depende en gran medida de cómo planea implementar su código de red una vez que llegue allí. Quake (o algún título de identificación posterior tal vez, mi memoria es un poco borrosa), por ejemplo, adoptó el enfoque de ser siempre cliente / servidor. Incluso la opción para un jugador se conecta a un servidor en 127.0.0.1 y no invita a otros jugadores, lo que significa que incluso el juego para un jugador se ejecuta completamente a través del código de red.
LLL79
Eso es lo que tenía en mente. Tal vez alguna comunicación entre procesos para que no necesite conectarse cuando quiera jugar solo o tal vez una clase que tenga las mismas funciones que el cliente pero lo maneje como el servidor de inmediato.
Ghork
3
La mejor práctica ha sido "no" durante bastante tiempo. A menos que esté escribiendo un juego por turnos, simplemente tiene que diseñar las cosas de manera diferente para manejar las redes. Si te importa la latencia, la corrección y el engaño, simplemente no hay forma de evitarlo. Si no lo hace, realmente no necesita pensar mucho en ello: si no tiene la experiencia, no va a predecir el diseño adecuado de todos modos. La mejor manera es comenzar con un par de prototipos en red para ganar experiencia en redes, realmente.
Luaan
Si lo piensas, Minecraft tiene un servidor local incluso en juegos de un solo jugador. El servidor es el motor, el cliente es solo un presentador.
SparK

Respuestas:

12

Sin saber más sobre el juego exacto que estás escribiendo y cómo lo estás escribiendo, es muy difícil decir soluciones genéricas a tu problema.

Sin embargo, es posible que desee considerar esta decisión que está tomando de dejar el código de red hasta el final, dependiendo de cuán crucial sea la red para su juego.

Lo que quiero decir es que, si estás escribiendo un juego pesado de red, como un MMORPG, puede que no sea aconsejable dejar la red hasta el final.

Dicho esto, si el impacto que espera para el código de red es bajo (como en el caso de que no tener código de red no sea un factor decisivo), entonces podría ser apropiado dejarlo para una etapa posterior (pero no demasiado tarde).

Recuerde que escribir código de red no es lo mismo que pensar en ello. A medida que toma decisiones sobre cómo se hace su juego, debe considerar cómo esto afectaría las decisiones de la red, y si el impacto esperado es alto, tal vez impleméntelo como un trozo que brinde información genérica, y luego cuando sea el momento de escribir la red código, solo es cuestión de enchufarlo donde dejaste el trozo.

Entonces, por ejemplo, si está haciendo un juego de ajedrez en línea, puede tener una función llamada ExecuteMove()que se llama de alguna manera cuando un movimiento se ingresa con el mouse, y de otra manera cuando un movimiento se ingresa con el teclado. En este punto, es posible que desee pensar en crear un código auxiliar de red que, después de obtener los datos requeridos del otro host (esto es lo que escriba en una parte posterior), llame ExecuteMove().

De esa manera, a medida que creas tu juego, sabrás qué partes están afectadas por el código de red, y cuando sea el momento de escribir el código de red, estarás varios pasos por delante.

Si es la primera vez que escribes un juego en red, considera no pensar demasiado en la lucha contra las trampas y cosas así. Hacer un juego en red es lo suficientemente complejo como para requerir que todo un equipo de personas altamente experimentadas lo haga para un juego AAA, así que tómatelo con calma y primero crea un juego que funcione, antes de enfocarte en temas más complejos.

Finalmente, si es la primera vez que haces un juego, no lo hagas en red, por favor. Hacer un juego es tan complejo que cada requisito que agregue a su juego lo hará exponencialmente más complejo.

Pijama Panda
fuente
Bueno, no es MMO, así que no será TAN pesado en la red. Sin embargo, no es un juego de mesa rancio en el que está bien tomarse unos segundos antes de que se realice un movimiento. Siento que las redes deberían pensarse desde el principio porque, en mi experiencia, agregar multijugador en las últimas etapas no va a funcionar. Sin embargo, no quiero escribir código de red y depurar eso antes de que pueda hacer que mi personaje se mueva y choque con objetos.
Ghork
2
@Ghork: ¡Ah, quieres que tu producto haga cosas bonitas lo antes posible! Bueno, sí, todos lo hacemos. Pero sucumbir a esa tentación no conducirá a un programa bien diseñado y bien pensado.
ligereza corre en órbita el
Aceptaré esta respuesta, aunque también me gustan las otras respuestas. Específicamente el comentario de @Luaan
Ghork
2

Estoy en una situación similar, pero estoy tratando de hacer una simulación en red más que un juego; pero creo que mi enfoque puede ayudarlo en su proceso de diseño.

Mi enfoque está en la línea de su comentario sobre IPC (comunicación entre procesos).

Primero, como antecedentes, estoy estudiando el libro "Gráficos en red" de Steed y Oliveira. Esto proporciona una buena base en varias arquitecturas de red para juegos, dependiendo de varios criterios y tipos de juegos. Proporciona una herramienta para ayudarlo a decidir la arquitectura de su juego y qué es exactamente lo que quiere poner en la red, y qué quiere que ocurra localmente.

En segundo lugar, separe los componentes de la red en un subproceso de fondo separado para que su desarrollo inicial del juego pueda codificar el componente localmente, pero se ve obligado a lidiar con la separación del subproceso. No los combine con ninguna otra característica que luego será "fondo local", sino que los fuerce a subprocesos de fondo "potencialmente remotos".

Esto debería ayudar a mantener su lógica separada y también permitirle simular factores de retraso de la red en el proceso para que también pueda ver el impacto de la latencia.

Joe Van Steen
fuente
¡Supongo que tendré que revisar ese libro entonces! Suena prometedor poder hacer lo que dijiste.
Ghork
@Ghork: la clave es descubrir su arquitectura, lo que quiere local y lo que quiere en un servidor; o cómo quieres que tus compañeros se comuniquen e interactúen. Ese libro debería ayudar. Luego, coloque todo lo que desee de forma remota en el otro lado de una llamada de mensaje IPC a través de un conjunto de código cliente-servidor que (por ahora) se mantiene local pero mantiene cosas "remotas" en hilos separados. En el componente de paso de mensajes IPC, agregue artificialmente cualquier latencia que desee simular. ¡Buena suerte!
Joe Van Steen
1

Si estás aprendiendo sobre todo esto, ¿por qué no escribes una versión 1 para un jugador simple, y una vez que esté funcionando, con tu conocimiento más profundo, reconsidera todo en profundidad para la versión 2 que será multijugador?

Etienne Charland
fuente
0

Implemente una clase de "red falsa" que pase mensajes entre hilos, que tiene la misma interfaz que tendrá la clase de red. Más tarde, puede elaborar la red falsa para tener demoras aleatorias y pérdida de paquetes. Siempre será más fácil depurar el código de red con la clase falsa que con la red real.

ddyer
fuente