Acerca de
Estas son en realidad dos preguntas en una. En primer lugar, estoy buscando una manera de almacenar eficientemente grandes cantidades de datos de mosaico. El otro aspecto trata de consultar el conjunto de datos y mostrar mosaicos. Déjame darte algunos antecedentes primero.
Estamos haciendo un juego de magnate multijugador basado en navegador usando la biblioteca CraftyJS para representarlo en Canvas. En el fondo de la GUI, estamos ejecutando Yii Framework en PHP y todo se conecta a un generador de mapas aleatorios de Python y un motor de juegos.
Así es como se ve el primer renderizado del mapa aproximado: http://i.imgur.com/khAXtl.png
Almacenar los datos del mapa
El mundo del juego se genera aleatoriamente cada vez que comienza el juego. El tamaño es de 100x100 fichas hexagonales para cada jugador. Eso significa que para un juego de tres jugadores, se crean 90,000 fichas. Actualmente solo creo una matriz de JavaScript desde la que renderizo el mapa.
Esto funciona bien para renderizar, pero para cualquier tipo de interacción con el mapa necesitamos almacenar qué jugador posee el mosaico, qué tipo de estructura se construye encima, cuál es su precio actual, etc. Al principio, al menos para el prototipo, queríamos usar MySQL, pero después de algunas pruebas, no es exactamente tan rápido como me gustaría. Quizás un almacén de objetos como MongoDB sería más adecuado para almacenar datos de mosaico en lugar de una tabla SQL. O tal vez algo más?
Mostrar el mapa
Otro problema que veo es moverse por el mapa. Actualmente estoy creando entidades Crafty para cada mosaico, incluso si no está en la ventana gráfica. Esto es lento, porque a pesar de que Crafty representa solo los que están en la ventana gráfica, almacena y posiblemente repite todos los mosaicos en cada evento de representación. Lo que tengo actualmente es un mapa generado generado que es muy lento para cargar y tartamudea cuando te mueves, ahora me gustaría hacerlo jugable.
Mi primera idea fue cargar el subconjunto de mosaicos que se muestran en la ventana gráfica. Pero cuando un jugador mueve la ventana gráfica a un área en blanco, necesito consultar el servidor y esperar la respuesta, solo entonces se puede representar el mapa. Esto estaría bien en una aplicación nativa, pero es lenta en un juego web.
La forma de obtener un rendimiento uniforme del mapa podría ser precargar un subconjunto más grande de mosaicos en una matriz de JavaScript y usarlo como caché. El jugador tendría algunas pantallas "en caché" y cuando mueva la ventana gráfica, cargaría más fichas en el "caché" de JS.
¿Me dirijo en la dirección correcta? Me encantaría obtener más información de alguien que haya hecho algo similar. Soy nuevo en el desarrollo de juegos, pero he pasado por muchas fuentes en las últimas semanas.
fuente
Respuestas:
Jugabilidad
Antes que nada me gustaría preguntarte, ¿realmente necesitas 10.000 fichas por jugador? Si bien no sé qué tipo de juego estás haciendo, generalmente es cierto que los mapas grandes son juegos largos. El mapa más grande en Civilization 5 es 10240 fichas, y eso solo funciona porque no necesitas jugar en más de una fracción.
Base de datos
No debe intentar ejecutar un juego como este desde una base de datos, debe mantener los datos en la memoria de la aplicación. Puedes usar una base de datos para hacer una copia de seguridad del juego. Para una copia de seguridad completa, guarde una serialización de los datos del juego, y luego puede incrementarla guardando las órdenes dadas y luego volver a ejecutarlas si la copia de seguridad necesita ser utilizada.
Almacenamiento de JavaScript
En cuanto al cliente, diría que es mejor que mantenga todo el mapa cargado, al menos si se adhiere a los miles de mosaicos que lo tienen todo en un bonito árbol de objetos podría ser demasiado, por lo que probablemente debería mantener los datos en un formato codificado "semi-binario". Las cadenas funcionan excelente para este tipo de cosas, alternativamente, puede almacenar de forma segura enteros sin firmar de hasta 53 bits en un flotante de 64 bits, rellenar muchos de ellos en una matriz y creo que verá una huella de memoria bastante modesta.
Visualización de JavaScript
Si bien no diré que no necesariamente debe usar el lienzo, en realidad no lo necesita para cosas como esta. Configúrelo todo como un grupo de elementos img y cambie la propiedad src para mostrar diferentes partes del mapa.
Consejo profesional
Por cierto, a veces es más fácil compartir la semilla utilizada para generarla que compartir todo el mapa.
fuente
MySQL no es lento. Lo más probable es que esté realizando consultas ingenuas o que tenga índices subóptimos. Los enfoques NoSQL como MongoDB pueden ser más rápidos, tal vez no. Su patrón de acceso y elección de consulta es lo que realmente importa aquí. Es posible dar consejos sobre cómo mejorar el rendimiento, pero no sin ver lo que ya está haciendo.
Sí, por supuesto. No hay mucho que agregar aquí: el cliente solicita mosaicos del servidor, por lo que solo debe asegurarse de que los que solicite cubran un área más grande que la pantalla.
Apéndice:
Si eres competente con Python, te aconsejo que abandones al intermediario de PHP. Si ejecuta su juego como un proceso de Python, puede mantener sus datos de mosaico en la memoria mucho más fácilmente y reducir significativamente los accesos de MySQL. Ayuda que Python sea un lenguaje mucho más sano que PHP también.
fuente