Anoche estaba aburrido y recordé que siempre me molestó que todas las sources de Conquer usan ConcurrentDictionary o una variacion de Dictionary con locks para almacenar las entidades (personajes, mobs, npcs, etc...), esta implementacion en la practica no es mala ya que el numero de entidades por mapa suele ser relativamente baja, asi que quise hacer algunas pruebas usando una implementacion INEFICIENTE de Spatial Hash, ¿por que ineficiente? porque uso a la vez un Dictionary para almacenar la ubicacion de cada entidad como veran en el codigo lo cual genera un retardo en algunas de las funciones del Spatial Hash, pero lo considere necesario para una implementacion facil de mantener.
Todas las pruebas se hicieron usando la herramienta de diagnostico de Visual Studio y estan medidas en milisegundos.
Nota 1:
Las pruebas hechas para comprobar que el SpatialHash fueron pocas, aprobadas pero pocas.
Nota 2:
Las pruebas hechas con threads fueron usando la clase Parallel, no indagué como funciona exactamente pero asumo que es similar al ThreadPool usado por los sockets asincronos en C#, mi ideal era acercarme lo mas probable a un entorno similar al de un Servidor de conquer
Resumen:
- Es facil notar que un ConcurrentDictionary es mas rapido con pocos
elementos, parece obvio ya que ejecuta pocas operaciones en
comparacion al Spatial Hash en este caso, es la tendencia hasta 130
entidades aproxiamadamente, luego el Spatial Hash tiene una
eficiencia bastante alta en comparacion debido a que no escala con la
cantidad de entidades en el mapa (lo hace pero con un factor mucho
mas bajo).
- ConcurrentDictionary escala mucho mejor con el numero de threads, es obvio ya que la implementacion del Spatia lHash esta usando locks,
por lo que aumentara linealmente el tiempo con el numero de threads.
- Spatial Hash escala mucho mejor con el numero de entidades, esto solventa la falta de concurrencia para un numero sobre 150~ de
entidades.
En resumen, ciudades como Bird Island, Ape, Phoenix entre otras presentarian una mejora con el uso de Spatial Hash, pero ciudades pequeñas se verian afectadas negativamente, el sistema de Screening que es usado actualmente no parece ser un cuello de botella para las sources actualmente, en definitiva, siendo esta la ADT que mas podria afectar el rendimiento de un servidor, no hay problemas en cuanto a que estructuras de datos son usadas, sino que son problemas de como son implementadas los sistemas del juego,