Ottimizzazione Script

INFO

I pattern Lua inefficienti sono la causa più comune di lag. Questa nota riassume i pattern chiave, integrando il modulo Ottimizzazione e Debug di Lua con focus su performance server.

ObiettivoDettagli
Cosa imparerai• Livelli di Wait corretti
• Evitare iterazioni inutili
• Cache di valori e nativi
• Distanza efficiente
Prerequisiti• Lua base (modulo 08)

1. Livelli di Wait

ContestoWait consigliato
Input/UI (deve rispondere subito)Wait(0)
HUD / mini-mapWait(100)
Check di distanzaWait(500)
Controlli sporadiciWait(1000)+

WARNING

Un while true do Wait(0) con operazioni pesanti gira 60 volte al secondo inutilmente. Se il check non cambia significativamente in 1 secondo, Wait(1000) basta.

-- client.lua
CreateThread(function()
    while true do
        local coords = GetEntityCoords(PlayerPedId())
        local dist = #(coords - Config.TargetCoords)
 
        if dist < 50.0 then
            -- fa qualcosa di rilevante
        end
 
        Wait(500)  -- controllo di distanza: non serve ogni frame
    end
end)

2. Event-Driven Invece di Polling

Quando possibile, reagisci a eventi invece di controllare in loop.

-- Invece di un loop che controlla se il giocatore ha l'arma ogni frame...
RegisterNetEvent('ox_inventory:update')
AddEventHandler('ox_inventory:update', function()
    -- ... reagisci quando l'inventario cambia
end)

3. Cache di Valori Statici

Non ricalcolare valori che non cambiano.

-- Sbagliato: GetHashKey ricalcolato ogni frame
CreateThread(function()
    while true do
        Wait(100)
        local hash = GetHashKey('my_vehicle')  -- stesso valore ogni volta!
    end
end)
 
-- Giusto: calcolato una volta
local MY_VEHICLE_HASH = GetHashKey('my_vehicle')
CreateThread(function()
    while true do
        Wait(100)
        -- usa MY_VEHICLE_HASH
    end
end)

4. Distanza Efficiente

Usa la forma vettoriale compatta e riduci i confronti.

-- Forma compatta e veloce
local dist = #(coords - target)
 
-- Meglio ancora: confronta il QUADRATO se ti serve solo una soglia
local dx, dy, dz = coords.x - target.x, coords.y - target.y, coords.z - target.z
if dx*dx + dy*dy + dz*dz < 2500 then  -- 50^2 = 2500
    -- entro 50 unità
end

TIP

Evita GetDistanceBetweenCoords nelle hot path: le operazioni vettoriali native Lua (#(a - b)) sono più leggere.


5. Server: Evita Query nel Loop

Mai fare query al DB dentro un loop. Cache o fai le query una volta.

-- Sbagliato (eseguito 1000 volte al secondo)
CreateThread(function()
    while true do
        Wait(0)
        MySQL.query('SELECT * FROM ...')
    end
end)
-- Giusto: carica una volta, aggiorna con eventi
local cachedData
CreateThread(function()
    cachedData = MySQL.query.await('SELECT * FROM ...')
end)

WARNING

Le query sincrone nel loop bloccano il server. Usa MySQL.query.await una volta e cache, oppure gli eventi del framework.


6. NUI

La UI web (NUI) consuma risorse se aggiornata troppo spesso.

  • Invia SendNUIMessage solo quando i dati cambiano
  • Non aggiornare l’HUD 60 volte al secondo se basta a 5-10 fps
  • Usa Wait(100)+ per aggiornamenti HUD

Vedi NUI e UI per i dettagli.


Verifica

  • Loop con Wait coerente col tipo di check
  • Valori statici in cache
  • Distanza calcolata in modo efficiente
  • Nessuna query DB nel loop
  • NUI aggiornata solo quando necessario

TIP

Prossimo passo: 05 - Entity Budget


Torna alla: Indice Generale