Cien en la plaza
Pusimos cien jugadores en la ciudad al mismo tiempo, cada uno con cuenta, dos personajes y un equipo, caminando sin rumbo y mandando un “hola” de vez en cuando. Aguantaron los dos minutos completos sin que se cayera nadie. Con eso se acabó la fase 1.
Por qué
El roadmap tenía una condición para salir de la fase 1: que la ciudad aguantara a cien personas. Preferimos descubrir el límite así a descubrirlo con gente de verdad quejándose en el chat.
Cómo funciona
Abrir cien copias del juego en una sola máquina no se puede, así que los cien bots viven en un solo programa, cada uno con su conexión, su cuenta y su camino. Para el servidor son cien personas distintas.
El primer resultado fue bueno en procesamiento y malo en red. El servidor gastaba unos 7 milisegundos por tick, de un presupuesto de 50, pero cada jugador recibía cerca de 16 KB por segundo. Todos nacen en el mismo lugar, así que cada uno veía unos treinta más, y las posiciones iban en un formato genérico, lleno de texto.
Lo cambiamos por un paquete binario: un número corto para cada jugador, posición en píxeles enteros y dirección en dos bytes. Salen ocho bytes por persona vista. El ancho de banda bajó a 2,6 KB por segundo por jugador, seis veces menos, lo que cabe de sobra en una conexión de celular.
| Métrica (100 jugadores) | Antes | Después |
|---|---|---|
| Tick promedio del servidor | ~7 ms | ~7 ms |
| Peor tick | ~40 ms | ~40 ms |
| Enviado por jugador | ~15,8 KB/s | ~2,6 KB/s |
Esto fue en una máquina de desarrollo, con servidor y bots compartiendo el mismo procesador, así que en un servidor de verdad debería sobrar más. El peor tick de 40 ms aparece en los picos, y es el que vamos a vigilar cuando crezca la ciudad.
Siguiente paso
Fase 2: el resto de los sistemas, empezando por el inventario de verdad y la granja.
Cambios
- perf(city): 8-byte binary city snapshots; 100-bot load test passes
CityCodec packs each visible player as u16 id, u16 x, u16 y, s8 dir x/y; static info carries the short id once. Load tool runs many bots in one process with a SceneMultiplayer per bot; server prints tick and bandwidth stats with --stats. 100 of 100 bots stayed in the city for 2 minutes: ~7 ms average tick, bandwidth per player down from ~15.8 to ~2.6 KB/s. Closes fase 1; roadmap moves to fase 2. Protocol 6.