Cliente y servidor a fondo · Lección 2/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. Esto es independiente del framework.

El asesino de FPS

lua
-- ❌ 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

lua
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 (compruébalo con resmon).

Practica lo aprendido

0/3
Test

¿Cuál es la causa nº1 de lag (caída de FPS) en el cliente de FiveM?

Corrige el error

Este thread quema CPU: corre cada frame siempre. Arréglalo con un Wait dinámico que descanse 1000ms por defecto y solo baje a 0 cuando el jugador esté cerca.

Este código tiene un fallo:

1CreateThread(function()
2 while true do
3 Wait(0)
4 local ped = PlayerPedId()
5 local dist = #(GetEntityCoords(ped) - Config.ZonaTienda)
6 if dist < 20.0 then
7 -- dibujar marcador
8 end
9 end
10end)

Reescríbelo corregido:

Pista

Declara local sleep = 1000 al principio del bucle, ponlo a 0 solo dentro del if dist < 20.0, y termina con Wait(sleep).

Ordena el código

Ordena un thread con Wait dinámico que solo trabaja cuando el jugador está cerca de la zona.

Coloca las líneas en el orden correcto con las flechas.

local dist = #(GetEntityCoords(PlayerPedId()) - Config.ZonaTienda)
Wait(sleep)
CreateThread(function()
local sleep = 1000
end)
end
if dist < 20.0 then sleep = 0 end
while true do
Pista

Abre el thread y el bucle, declara sleep alto, calcula distancia, bájalo solo si estás cerca, y duerme con Wait(sleep) al final.

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:

¿Qué tal esta lección?