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.
| Obiettivo | Dettagli |
|---|---|
| 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
| Contesto | Wait consigliato |
|---|---|
| Input/UI (deve rispondere subito) | Wait(0) |
| HUD / mini-map | Wait(100) |
| Check di distanza | Wait(500) |
| Controlli sporadici | Wait(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à
endTIP
Evita
GetDistanceBetweenCoordsnelle 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.awaituna volta e cache, oppure gli eventi del framework.
6. NUI
La UI web (NUI) consuma risorse se aggiornata troppo spesso.
- Invia
SendNUIMessagesolo 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