Gestión de entidades en FiveM
La gestión de entidades es una de las áreas más críticas del desarrollo en FiveM para el rendimiento. Cada vehículo, ped u objeto creado consume CPU, memoria y ancho de banda de red. Los servidores mal gestionados acaban con miles de entidades huérfanas que tumban el rendimiento y saturan la sincronización de red. Entender cómo se crean, se sincronizan y se retiran las entidades es fundamental para construir scripts escalables.
Spawn y propiedad de entidades
Las entidades en FiveM tienen un concepto de propiedad: el cliente que las creó normalmente es su dueño y gestiona su lógica. Los otros clientes las ven como copias replicadas. Esto tiene implicaciones importantes: el dueño puede desconectarse y las entidades pueden quedar "huérfanas". Usa SetEntityAsMissionEntity para evitar que el motor haga culling automático de entidades importantes y SetEntityDistanceCullingRadius para ampliar la distancia a la que se despawnean.
Spawn basado en proximidad
Spawnear todas las entidades al arrancar el recurso no escala. El patrón correcto es spawn por proximidad: crear entidades cuando los jugadores se acerquen y despawnear cuando se alejen. Divide el mapa en zonas y controla qué zonas tienen jugadores activos. Un bucle periódico que compruebe distancias entre jugadores y zonas cada pocos segundos es mucho más eficiente que gestionar entidades continuamente.
Limpieza y lifecycle
Libera entidades que ya no necesites con DeleteEntity o SetEntityAsNoLongerNeeded. El segundo deja que el motor libere la entidad cuando considere oportuno, lo cual es útil para entidades no críticas. En el handler onResourceStop, limpia todas las entidades que tu recurso haya creado para evitar dejarlas como basura al reiniciar. Mantén referencias de handles a todas las entidades activas para poder limpiarlas con seguridad.
Sincronización y performance de red
Cada entidad networked envía actualizaciones de posición y estado por la red constantemente. Minimiza entidades networked cuando no sea imprescindible. Para props puramente visuales que no necesitan sincronización, usa entidades no networked con el flag correspondiente en CreateObject. Para entidades compartidas que varios jugadores deben ver, asegúrate de que estén registradas correctamente en el servidor para que nuevos jugadores al conectar las reciban.
