¿Qué técnicas permiten que los juegos basados ​​en la web actualicen los recursos del jugador con frecuencia?

8

Hace mucho tiempo hubo un juego basado en la web llamado Utopía (y estoy seguro de que todavía está disponible), los turnos son por hora. Solo obtienes oro / madera nueva o qué, no cada hora.

Algunos juegos basados ​​en web más nuevos tienen recursos que se incrementan en una resolución más fina, como por minuto. Entonces, supongamos que un jugador tiene una tasa de producción de alimentos de 5 por minuto: el jugador aumentará su cantidad de comida cada minuto. No estoy seguro de si es aconsejable configurar constantemente un trabajo CRON para actualizar la base de datos SQL, que supongo que lo están utilizando, ya que está basado en la web. Quizás me equivoque, cada minuto.

¿Qué técnicas usan esos juegos basados ​​en la web? Agregado en Editar: ¿ Y la base de datos puede realmente manejar la carga?

Extrakun
fuente

Respuestas:

7

Me parece que podría almacenar las tasas de producción, el nivel de recursos base y una última marca de tiempo actualizada. Luego, cada vez que necesite conocer el nivel real de recursos, simplemente puede multiplicar la tasa de producción por el tiempo transcurrido.

Siempre que cambie el nivel real de recursos, simplemente actualice el nivel base. Siempre que cambie la tasa de producción, actualice el nivel base al nivel real y la marca de tiempo a la hora actual.

De esta manera, en lugar de actualizar cada jugador (presumiblemente, incluidos los que no están actualmente conectados) cada minuto, solo está actualizando las filas que los jugadores están utilizando activamente.

(Si su juego "funciona" una vez por minuto, imagino que un "número de turno" de algún tipo podría ser mejor que una marca de tiempo real).

Un beneficio adicional de este sistema es que puede usar la misma lógica utilizada para actualizar la base de datos y predecir valores sin modificarlos, para enviar solo la información necesaria al cliente (en lugar de actualizar una vez por minuto) y predecir valores en el cliente.

Andrew Russell
fuente
3
En realidad, esto requiere cierta comprensión de las matemáticas complejas en algunos casos. Considere ganar intereses sobre dinero: agregar 1% de interés una vez al mes no es lo mismo que agregar 12% de interés una vez al año. Segundo ejemplo, si la probabilidad de que ocurra un evento en un minuto dado es del 10%, la probabilidad de que ocurra después de 10 minutos no es del 100%. Curiosamente, esto es solo una demostración muy lenta de los problemas de física que las personas ven en otros juegos, y el mismo método se puede utilizar para abordarlos, es decir. use un paso de tiempo fijo y ejecútelo tantas veces como sea necesario para 'ponerse al día'.
Kylotan
77
Kylotan, no clasificaría el interés compuesto y las oportunidades de probabilidad múltiple como matemáticas complejas. : P
El pato comunista
1
Es un punto valido. Pero espero que cualquiera que implemente la producción de recursos no lineales en sus juegos entienda cómo funciona;)
Andrew Russell,
2
Pero no es necesario, si están utilizando la actualización periódica anterior. Ese es todo el problema al que me estoy enfrentando: el uso de este método introduce un nuevo error potencial que antes no era posible.
Kylotan
2
¿No podría utilizar un proceso iterativo para asegurarse de que todo se aplica correctamente? Cuando un jugador inicia sesión, "activa" cada uno de los recursos que luego se disparan en un bucle hasta que el siguiente tiempo de tick sea posterior al tiempo actual del sistema. Tal vez un poco más intensivo en recursos, pero debería ocuparse de la mayoría de los sistemas no lineales.
Lunin
5

Las bases de datos SQL modernas que se usan comúnmente (MySQL, Postgres, Oracle, MSSQL, etc.) le permiten programar procedimientos almacenados para que se ejecuten con intervalos de tiempo arbitrarios. Es un método muy liviano para ejecutar actualizaciones como esta y elimina la necesidad de invocar un script o programa externo para hacerlo por usted.

Esto también permite que la base de datos optimice la consulta que ejecuta solo una vez, en lugar de hacerlo cada vez que lo invoca un script externo, por lo que es muy útil desde el punto de vista del rendimiento. Por supuesto, esto solo se aplica si sus actualizaciones son lo suficientemente triviales como para ser programadas en el lenguaje de scripting de su base de datos. Las actualizaciones de recursos, las desconexiones automáticas de intervalos de tiempo, la depuración de registros y los gustos son excelentes candidatos para estos procedimientos almacenados programados.

Lo más probable es que la carga que está experimentando su base de datos provenga del 99.9% de las cargas de página, actualizaciones del motor del juego y similares, ya que un juego popular puede tener fácilmente cientos de miles de consultas por segundo. En comparación con la carga que surge de ejecutar algunas consultas (aunque las que tocan gran parte de una tabla) una vez por minuto, la carga no debería ser un problema. Es decir, a menos que actualice los valores indexados por la base de datos. Debe evitar actualizar las columnas indexadas a toda costa si le preocupa el rendimiento.

Fuu
fuente
2

En cuanto a las actualizaciones:

Algunos usan trabajos CRON que llegan a una determinada página PHP de vez en cuando.

Algunos usan trabajos CRON, esta vez ejecutando cierto proceso.

Otro enfoque es hacer actualizaciones 'justo a tiempo': cada vez que se carga una página, ejecuta las actualizaciones pendientes y realizalas en ese punto. Generalmente, esto es lo que debe hacer si no puede ejecutar trabajos CRON o procesos de larga duración.

Finalmente, otros ejecutan toda la aplicación web como un solo proceso, por lo que pueden actualizarse cada vez que lo vean.

El sistema final es el mejor si tiene esa opción disponible, ya que puede almacenar los datos en la memoria. Actualizar unos pocos miles de jugadores una vez por minuto es trivial si solo está cambiando datos en RAM en lugar de tener que escribir en una base de datos SQL tradicional.

Pero si no tiene ese lujo, puede usar algún tipo de almacenamiento en caché. Algo como memcached puede ser una opción (dependiendo de su alojamiento) que es un punto intermedio entre la memoria y una base de datos. Puede almacenar valores transitorios en memcache y solo guardarlos en la base de datos cuando sea absolutamente necesario.

Entre memcache y una base de datos SQL tradicional hay otras opciones, por ejemplo. las diversas tiendas de clave / valor o tiendas de documentos: cosas como MongoDB , CouchDB , las ofertas de Amazon o Google, etc. Todos los sistemas bajo el término general NoSQL . Por lo general, estos no le brindan el poder de consulta genérico ni siempre las mismas garantías de seguridad de una base de datos tradicional, pero a menudo son mucho más rápidos en la operación. (Lo cual no es tan sorprendente, ya que están haciendo menos por ti).

Pero todo esto supone que una base de datos normal no puede manejar la carga. De hecho, en la mayoría de los casos probablemente sí. Si tengo que emitir 10,000 llamadas de ACTUALIZACIÓN por minuto para aumentar los niveles de recursos, eso no es muy escalable una vez que comience a agregar todo lo demás en la parte superior. Pero si cambia eso para actualizar el recurso para todos con 1 llamada SQL, de repente las cosas se ven mucho más positivas. Por lo tanto, no sobreestime lo costosa que es cierta característica, ya que a menudo se puede implementar de una manera más eficiente.

Kylotan
fuente
0

Estoy a favor de KISS : "Keep It Simple, Stupid!"

No veo ninguna razón por la que un trabajo cron no funcione, y la ventaja es que las opciones de alojamiento web baratas a menudo no le permiten ejecutar comandos directamente, pero sí le permiten ejecutar comandos cron. Por lo tanto, no hay necesidad de un servidor dedicado costoso.

También puede hacer su código de actualización en PHP o en su idioma de preferencia, con el comando cron o usando el navegador de texto. Las instrucciones en Configuración de trabajos cron tienen varios comandos de ejemplo que puede usar para hacer ping a su propia página a intervalos.wget --spider http://yoursite.com/secretphppage.phplynx

Ricket
fuente
Supongo que estoy más preocupado por un trabajo CRON que se ejecuta cada minuto actualizando los datos de unos cientos de usuarios a la vez.
Extrakun
1
Una actualización de varios cientos de conjuntos de datos una vez por minuto no es un problema para una base de datos moderna. No sé cómo se ven sus consultas, pero una sola llamada 'ACTUALIZAR' aún debería funcionar bien incluso con miles de filas afectadas.
bummzack
¿Y en qué mundo un trabajo cron se considera "simple"? Si no eres un administrador de sistemas, es probable que te enojes con solo mirar su archivo de configuración ...
o0 '.
El mundo de los servidores web, donde no (generalmente) le dan acceso SSH, por lo que deben proporcionar una interfaz fácil para Cron. Mi webhost (Lunarpages) usa Cpanel, y me resulta bastante fácil de usar: img822.imageshack.us/img822/7022/easycron.png
Ricket
0

Recuerdo haber echado un vistazo al código de un clon de Planetarion. Todo es PHP, pero el código de ticker está en C sin procesar, con enlaces de MySQL en C. Debido a que el modelo de datos era muy simple, las actualizaciones ocurren muy rápido.

Ariejan
fuente