Javascript y PHP para multijugador en tiempo real? [cerrado]

13

Me pregunto si combinar el lado del cliente de Javascript con el lado del servidor de PHP / mysql es una buena idea para los juegos de navegador HTML5 en tiempo real (escala pequeña).

Mi conocimiento técnico es muy limitado, y aunque planeo aprender node.js en el futuro, la curva de aprendizaje es bastante grande en este momento.

Como ya estoy familiarizado con PHP, creo que lo haría funcionar mucho más rápido.

La escala que estoy pensando es de 2 a 8 jugadores en ese momento. Y tratando de mantener el recuento de mensajes del cliente al servidor lo más bajo posible.

Los valores que pretendo almacenar / manejar son:

  • Nombre e identificación del jugador.
  • Posición X e Y.
  • Salud.
  • Artículos equipados (máximo 8 espacios, probablemente menos).
  • Acciones (caminar, atacar, usar, etc., pero solo 1 acción / jugador a la vez).
  • Bullet X, Y coordenadas y trayectoria.
  • Nombre del clan / clan.
  • Y algunas funciones básicas de chat / correo.

Supongo que, aunque no es la mejor solución, pero mientras mantenga la lógica pequeña, esto es completamente factible. Estoy en lo cierto?

justanotherhobbyist
fuente
44
Suena perfectamente factible. ¿Por qué no lo intentas? En el peor de los casos, pasa algún tiempo aprendiendo, en el mejor de los casos, obtiene exactamente lo que desea.
William Mariager
1
Sí, pero imagino que esto llevaría un tiempo crear, y no me gusta perder el tiempo, por eso pregunté aquí. =)
justanotherhobbyist
8
Si aprendes algo, no perdiste el tiempo. ;) Algo que vale la pena considerar es que si cambias de idioma, pasarás tiempo aprendiendo el nuevo idioma y aprendiendo redes al mismo tiempo, lo que significa mucho más depuración para encontrar dónde te equivocaste. Si te quedas con lo que sabes, aprenderás primero sobre redes, y luego podrás portarlo si resulta ser ineficiente, y la próxima vez que alguien haga una pregunta similar, sabrás la respuesta correcta porque la probaste.
William Mariager
1
Eso es realmente un buen punto
justanotherhobbyist

Respuestas:

12

Para un juego en tiempo real, debes minimizar la latencia. Aquí hay dos consejos para lograrlo, con notas sobre PHP y Node:

  1. Use WebSockets. Permiten una comunicación bidireccional rápida entre el servidor y el cliente. El uso de node.js aquí tiene la ventaja de que puede usar la misma API de JavaScript en ambos extremos de la tubería. También está el maravilloso módulo socket.io para node.js que proporciona tecnologías de respaldo a navegadores menores que no admiten WebSockets. Googleando un poco, parece que también puedes usar WebSockets de PHP si realmente quieres.
  2. No incluya la base de datos en datos críticos en el tiempo, como las coordenadas de objetos que se mueven rápidamente. Esto significa mantenerlos en la memoria, que no es particularmente adecuada para el modelo tradicional de uso de PHP de hacer que se active una vez por cada solicitud de apache (o cualquier servidor web), pero puede iniciar su aplicación de servidor PHP también como independiente. Sin embargo , supongo que Node, con su núcleo V8, será más rápido que PHP . Si eso es un problema depende de cuán exigente sea tu juego y cuán poderoso sea el servidor.

Yo mismo encuentro que node.js es muy fácil de aprender y, dado que necesitarás codificar bastante JavaScript de todos modos, te recomiendo que lo pruebes. Al menos, eche un vistazo rápido a los tutoriales de socket.io para ver lo trivial que es configurar un canal de comunicación en tiempo real.

Tapio
fuente
+1 para el punto 2. El mayor error que puede cometer con esto es esperar que las consultas MySQL se activen en cada evento. Todo lo que pueda hacer para mover los datos del juego del HDD será de gran ayuda. He tenido éxito al abusar de Memcached por esto. Indudablemente hay otras formas.
DampeS8N
Sí, realmente quiero aprender el nodo, pero aún tengo que lograr que comience desde cmd, incluso, el mayor error que cometieron los desarrolladores fue hacer que sea tan difícil entrar. Al menos ahora la versión de Windows viene con un instalador, podría intentarlo si encuentro un buen tutorial.
justanotherhobbyist
El nodo no es nada difícil de iniciar o usar. Sí, es más difícil que PHP, pero PHP paga un precio terrible por su conveniencia: el diseño que permite que se incruste en Apache y se active de forma predeterminada en todas partes sin configuración también causa muchos problemas que hacen que PHP sea la peor y absoluta elección. puede ser un backend de juego en tiempo real. Node, Python, Ruby, Java, etc., todos requieren que configure el servidor de aplicaciones, pero ese mismo modelo permite un procesamiento en memoria controlado por eventos altamente escalable que es literalmente imposible de lograr en PHP.
Sean Middleditch
1

Junto con la respuesta de Tapio, me gustaría sugerir que solo (si es posible) envíe la entrada del usuario (clics y entrada del teclado) al servidor, y que tanto el servidor como el cliente emulen el juego. Cada N marca el cliente le pedirá una sincronización al servidor, y el servidor responderá con toda la información que el cliente necesita para representar el juego, como la salud, los elementos, etc. Esto es para asegurarse de que el cliente no se desincronice también mucho.

Por supuesto, tanto el servidor como el cliente necesitarán tener exactamente la misma implementación del juego, por lo que esto podría ser un poco más difícil. Si tiene implementaciones perfectas tanto en el cliente como en el servidor, el cliente necesitará sincronizarse con menos frecuencia.

Esto reducirá la mensajería cliente / servidor y esto reducirá la latencia. Esto también ayudaría a prevenir las trampas.

Suponiendo que esté creando este juego en JavaScript, podría valer la pena escribir también el back-end en JavaScript, utilizando NodeJS. De esta forma, podría reutilizar la implementación de JavaScript de su juego tanto para el servidor como para el cliente.

art0rz
fuente
0

Recomiendo aprender Nodejs. Si ya tiene Javascript, no será tan difícil. Hice un juego multijugador TRON rápidamente con Nodejs, y fue mi primer día usándolo. (Ah, y el cliente era un lienzo HTML5; solo estaba enviando información clave, como se menciona en los otros comentarios).

Eche un vistazo a un módulo llamado nowjs. ¡Buena suerte!

David Da Silva Contín
fuente