Entity Budget e Leak
INFO
OneSync ha un budget di entità sincronizzate. Se gli script non puliscono le entità, il budget si esaurisce e le entità “spariscono” o il server degrada.
| Obiettivo | Dettagli |
|---|---|
| Cosa imparerai | • Cos’è il budget entità • Rilevare e prevenire leak • Pool sizes • Pulizia corretta delle entità |
| Prerequisiti | • OneSync (modulo 11/04) • Concetti di spawn entità |
1. Cos’è il Budget Entità
OneSync sincronizza un numero limitato di entità per giocatore. Quando il limite viene raggiunto, le entità in eccesso non vengono instradate → oggetti/veicoli/ped che “spariscono” per alcuni giocatori.
| Entità | Limite tipico per giocatore |
|---|---|
| Peds | ~256 |
| Veicoli | ~256 (inclusi gli NPC) |
| Oggetti | dipende dal pool |
2. Entity Leak: Causa Principale
Il leak è una entità creata e mai cancellata. Ogni CreatePed/CreateVehicle/CreateObject deve avere un corrispettivo DeleteEntity quando non serve più.
Esempio di leak ❌
RegisterCommand('spawnped', function()
local model = GetHashKey('a_m_m_farmer_01')
RequestModel(model)
local ped = CreatePed(0, model, 0.0, 0.0, 0.0, 0.0, true, false)
-- Mai cancellato! Resta nel mondo per sempre
end, false)Con pulizia ✅
local spawnedPeds = {}
RegisterCommand('spawnped', function()
local model = GetHashKey('a_m_m_farmer_01')
RequestModel(model)
local ped = CreatePed(0, model, 0.0, 0.0, 0.0, 0.0, true, false)
SetPedDiesWhenInjured(ped, true)
-- Si pulisce quando il ped muore o il giocatore si allontana
spawnedPeds[#spawnedPeds + 1] = ped
end, false)
-- Pulizia periodica dei ped morti o distanti
CreateThread(function()
while true do
Wait(10000)
for i = #spawnedPeds, 1, -1 do
local ped = spawnedPeds[i]
local pedCoords = GetEntityCoords(ped)
local playerCoords = GetEntityCoords(PlayerPedId())
if not DoesEntityExist(ped) or #(pedCoords - playerCoords) > 200.0 then
DeleteEntity(ped)
table.remove(spawnedPeds, i)
end
end
end
end)3. Segnali di Leak
| Sintomo | Causa probabile |
|---|---|
| ”Entity limit reached” nei log | Troppe entità non cancellate |
| Oggetti spariscono per alcuni giocatori | Budget esaurito |
| FPS/server degradano nel tempo | Leak progressivo (più entità ogni ora) |
| Riavvio “sistema tutto” | Il riavvio pulisce i leak temporaneamente |
TIP
Test del leak: avvia il server, conta le entità (
GetEntityCoordsiterazione o Pool Monitor), aspetta 30 minuti, riconta. Se il numero cresce stabilmente senza che tu abbia fatto nulla → leak.
4. Pool Sizes
Quando hai molti asset dello stesso tipo (es. tanti veicoli custom unici), puoi aumentare i pool all’avvio:
increase_pool_size "TxdStore" 6000
increase_pool_size "Object" 2000
increase_pool_size "Peds" 500WARNING
I pool hanno limiti di sicurezza e vanno impostati solo all’avvio. Non aumentare pool “per sicurezza”: se esaurisci davvero un pool, il problema è il leak, non il limite.
5. Pulizia per Tipo di Entità
| Entità | Come pulirla |
|---|---|
| Ped | DeletePed(ped) o lascia che muoia con SetPedDiesWhenInjured |
| Veicolo | DeleteVehicle(vehicle) |
| Oggetto | DeleteObject(object) |
| Dopo disconnect | Evento playerDropped per pulire entità del giocatore |
Pulizia su disconnessione
-- server.lua
AddEventHandler('playerDropped', function()
-- Pulisci le entità di proprietà di questo giocatore
local source = source
-- es. DeleteEntity dei veicoli noleggiati, ped spawnati, ecc.
end)6. Spawn dal Server vs dal Client
Con sv_entityLockdown strict, le entità vanno create dal server (spawn sincronizzato) per essere visibili a tutti.
-- server.lua
RegisterCommand('spawnobj', function(source)
local coords = GetEntityCoords(GetPlayerPed(source))
local obj = CreateObject(GetHashKey('prop_bench_01'), coords.x, coords.y, coords.z, true, false, false)
SetEntityHeading(obj, 0.0)
FreezeEntityPosition(obj, true)
end, false)Verifica
- Ogni Create* ha un Delete* corrispondente
- Cleanup su
playerDropped - Pool Monitor non mostra pool al limite
- Test del leak: conteggio entità stabile nel tempo
Modulo Performance completato! Prossimo modulo: 14 - Sistemi di Gioco
Torna alla: Indice Generale