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.

ObiettivoDettagli
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)
Oggettidipende 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

SintomoCausa probabile
”Entity limit reached” nei logTroppe entità non cancellate
Oggetti spariscono per alcuni giocatoriBudget esaurito
FPS/server degradano nel tempoLeak progressivo (più entità ogni ora)
Riavvio “sistema tutto”Il riavvio pulisce i leak temporaneamente

TIP

Test del leak: avvia il server, conta le entità (GetEntityCoords iterazione 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" 500

WARNING

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
PedDeletePed(ped) o lascia che muoia con SetPedDiesWhenInjured
VeicoloDeleteVehicle(vehicle)
OggettoDeleteObject(object)
Dopo disconnectEvento 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