Cliente y servidor a fondo · Lección 3/4 · 9 min
Threads y Wait(): rendimiento sin morir
Los bucles mal hechos son la causa nº1 de lag en FiveM. Aprende a usar Wait() bien.
En el cliente, mucho código corre en bucles (threads). Si un bucle no descansa (Wait), revienta los FPS. El truco es hacer Wait largo cuando no pasa nada y corto solo cuando hace falta.
El asesino de FPS
-- ❌ MAL: corre 60+ veces por segundo SIEMPRE
CreateThread(function()
while true do
Wait(0) -- ¡nunca Wait(0) permanente!
local ped = PlayerPedId()
-- comprobaciones pesadas cada frame…
end
end)Mata el rendimiento
La versión sana
CreateThread(function()
while true do
local sleep = 1000 -- por defecto descansa 1s
local ped = PlayerPedId()
local coords = GetEntityCoords(ped)
local dist = #(coords - Config.ZonaTienda)
if dist < 20.0 then
sleep = 0 -- solo cuando estás cerca, va por frame
-- dibujar marcador, detectar tecla E, etc.
end
Wait(sleep)
end
end)Wait dinámico
Patrón de oro: una variable sleep que empieza alta (500-1000ms) y solo baja a 0 cuando el jugador está cerca/interactuando. Así tu recurso usa ~0.01ms en reposo.
Practica lo aprendido
0/3¿Por qué un CreateThread con while true do Wait(0) permanente mata el rendimiento?
Pista
Piensa en cuántas veces corre por segundo.
Completa el patrón de Wait dinámico: descansa por defecto y solo va por frame cuando el jugador está cerca.
CreateThread(function() while true do local sleep = local dist = #(GetEntityCoords(PlayerPedId()) - Config.ZonaTienda) if dist < 20.0 then sleep = end (sleep) endend)Pista
Empieza en 1000ms, baja a 0 cuando estás cerca, y al final Wait(sleep).
Arregla este bucle para que no mate los FPS: que descanse 1000ms y solo vaya a 0 cuando dist < 20.0.
Este código tiene un fallo:
CreateThread(function() while true do Wait(0) local dist = #(GetEntityCoords(PlayerPedId()) - Config.ZonaTienda) if dist < 20.0 then DrawMarker(--[[ ... ]]) end endend)Reescríbelo corregido:
Pista
Sustituye el Wait(0) fijo por una variable sleep dinámica.
Reto: prográmalo tú
Convierte un bucle que dibuja un texto 3D siempre en uno que solo trabaje cuando el jugador está a menos de 15 metros.
Escríbelo tú en tu editor (VS Code) y pruébalo en tu servidor. Aquí se aprende haciéndolo, no copiando.
Ver pista
Calcula #(coords - target); si dist<15 sleep=0 y dibuja, si no sleep=1000.
Escribe aquí tu solución:
