FiveM resmon hohe ms: Wie man langsame Scripts findet und behebt
Eine Ressource zeigt hohe ms in resmon? Wie man resmon 1 liest, warum Wait(0) Schleifen so viel kosten, und wie man schläft, wenn weit weg, ped cache und verwende ox_lib Points und Zones.
Du öffnest den Resource Monitor und ein Script zeigt dies:
my_script 0.35 msEin inaktives Script sollte nahe Null sein. Ein Script, das jeden Frame ein Drittel einer Millisekunde oder viel mehr frisst, lässt dein Spiel stottern, und die Spieler mit schwächeren Computern fühlen es zuerst. Dieser Leitfaden zeigt, wie man sieht, welche Ressource das Problem ist, und die Änderungen, die es reduzieren.
Öffne den Resource Monitor
In der F8-Konsole des Spiels, gib ein:
resmon 1Ein Overlay zeigt jede Client-Ressource mit ihrer CPU-Zeit (ms) pro Frame und ihrem Speicher. Gib resmon 0 ein, um es zu schließen. Überprüfe diese Dinge:
- Stehe still, an einem ruhigen Ort, und lese die Liste. Die Zahlen, die zählen, sind diejenigen, die hoch bleiben, wenn du nichts tust.
- Schaue wer oben ist. Eine Ressource, die nur in der Nähe ihrer eigenen Marker oder Shop hochgeht, ist normal. Eine, die überall hoch ist, ist es nicht.
- Beobachte es ein paar Sekunden. Ein einzelner Peak, wenn ein Script startet, ist harmlos; ein konstanter Wert ist das Problem.
Das ms ist Zeit auf dem Client. Server-Leistung ist ein separates Thema: siehe Server-Thread-Hitch-Warnung.
Ursache 1: eine Schleife mit Wait(0)
Der häufigste Grund für einen hohen Wert ist eine Schleife, die jeden Frame läuft, die ganze Zeit:
CreateThread(function()
while true do
Wait(0)
local ped = PlayerPedId()
local coords = GetEntityCoords(ped)
local dist = #(coords - vec3(215.0, -810.0, 30.7))
if dist < 3.0 then
DrawText3D(215.0, -810.0, 30.7, 'Press E')
end
end
end)Dies führt die Natives 60 Mal pro Sekunde aus, auch wenn sich der Spieler auf der anderen Seite der Karte befindet. Die meiste Zeit ist die Antwort „nichts zu tun", und diese Kosten werden verschwendet.
Behebung 1: schlafe, wenn du weit weg bist
Lass die Schleife länger schlafen, wenn nichts in der Nähe ist, und führe nur jeden Frame aus, wenn der Spieler in der Nähe ist:
CreateThread(function()
local target = vec3(215.0, -810.0, 30.7)
while true do
local sleep = 1000
local coords = GetEntityCoords(PlayerPedId())
local dist = #(coords - target)
if dist < 10.0 then
sleep = 0
if dist < 3.0 then
DrawText3D(target.x, target.y, target.z, 'Press E')
end
elseif dist < 50.0 then
sleep = 250
end
Wait(sleep)
end
end)Die Schleife überprüft einmal pro Sekunde, wenn du weit weg bist, was fast nichts kostet, und führt jeden Frame nur im Bereich von 10 Metern aus, wo es zeichnet. Verwende #(a - b) mit vec3 Werten für die Entfernung: Es ist schneller als die ältere GetDistanceBetweenCoords Native.
Behebung 2: cache Werte, die du wiederverwendest
Das Aufrufen einer Native jeden Frame, um einen Wert zu erhalten, der sich selten ändert, ist eine Verschwendung. PlayerPedId() ist die klassische. Speichere es einmal und aktualisiere es nur, wenn es sich ändern kann:
local ped = PlayerPedId()
CreateThread(function()
while true do
Wait(500)
ped = PlayerPedId()
end
end)Wenn du ox_lib verwendest, macht es das für dich. cache.ped wird aktualisiert, und cache.vehicle und cache.serverId funktionieren auf die gleiche Weise:
local coords = GetEntityCoords(cache.ped)lib.onCache lässt dich reagieren, wenn sich ein gecachter Wert ändert, ohne in einer Schleife zu überprüfen.
Behebung 3: höre auf, jedes Frame Natives aufzurufen
Überprüfe den Hauptteil der Schleife und frage für jede Zeile: Muss dies wirklich jeden Frame laufen? Ziehe heraus, was nicht ist.
- Zeichnen (Text, Marker, Sprites) muss jeden Frame laufen, aber nur während es sichtbar ist.
- Lesen von Daten (Job, Geld, Inventar) ist nicht: Lese es auf einem Event, und behalte es in einer Variable.
- Suchen (
GetClosestVehicle,GetGamePool, Schleifen über alle Spieler) ist teuer. Führe es einmal pro Sekunde oder zwei aus, nicht jeden Frame. - Erstelle nicht in einer Schleife: Die Erstellung von Blips, Text-Einträgen oder Tabellen jeden Frame füllt den Speicher und lässt den Garbage Collector arbeiten.
-- run once per second
local closest = nil
CreateThread(function()
while true do
closest = GetClosestVehicle(GetEntityCoords(cache.ped), 5.0, 0, 70)
Wait(1000)
end
end)Behebung 4: verwende ox_lib Points und Zones anstelle von Schleifen
Die meisten „bin ich in der Nähe dieses Spots" Schleifen sind nicht nötig. ox_lib kann die Entfernungsarbeit für dich machen, und läuft nur deinen Code aus, wenn es wichtig ist.
Ein Point ruft eine Funktion auf, wenn du einen Radius betrittst oder verlässt, und einen jeden Frame nur, während du darin bist:
local point = lib.points.new({
coords = vec3(215.0, -810.0, 30.7),
distance = 10.0,
})
function point:onEnter()
print('entered')
end
function point:onExit()
print('left')
end
function point:nearby()
DrawText3D(self.coords.x, self.coords.y, self.coords.z, 'Press E')
if self.currentDistance < 2.0 and IsControlJustReleased(0, 38) then
print('used')
end
endZones tun das gleiche für Formen wie eine Sphäre, eine Box oder ein Polygon:
local zone = lib.zones.sphere({
coords = vec3(215.0, -810.0, 30.7),
radius = 3.0,
onEnter = function() print('in') end,
onExit = function() print('out') end,
})Für die Interaktion mit Entities und Spots ersetzt eine Target-Ressource (ox_target, zum Beispiel) die „Drücke E"-Schleife auf die gleiche Weise. Überprüfe die ox_lib-Dokumentation für die genauen Optionen der einzelnen.
Überprüfe das Ergebnis
Führe resmon 1 erneut aus. Ein behobenes Script sollte in der Nähe von 0,00 ms sitzen, wenn du weg von seinen Spots stehst, und nur in die Höhe gehen, wenn du in der Nähe bist. Wenn es immer noch hoch ist, suche nach einer zweiten Schleife in der gleichen Ressource: Ein Wait(0) ist oft nicht der einzige.
Achtung: Setze keinen langen Sleep in einer Schleife, die einen Tastendruck oder eine Zeichnung handhabt. Wenn du 500 ms schläfst und der Spieler drückt die Taste, wird das Script sie vermissen. Schlafe nur, wenn du weißt, dass nichts vor sich geht, und fallen Sie auf
Wait(0)ab, wenn etwas vor sich geht.
Checkliste
| Symptom | Behebung |
|---|---|
| Hohe ms wenn inaktiv | Finde die while true do Wait(0) Schleife und füge einen entfernungsgestützten Sleep ein |
PlayerPedId() in jedem Frame |
Cache es, oder verwende cache.ped von ox_lib |
| Entfernungsprüfungen in einer Schleife | Ersetze mit lib.points.new oder lib.zones |
| Suche Entities jeden Frame | Führe es einmal pro Sekunde aus und behalte das Ergebnis |
| Lese Spielerdaten in einer Schleife | Lese es auf dem Framework-Event und speichere es |
| Verpasste Tastendrücke nach dem Hinzufügen eines Sleep | Verwende Wait(0) nur, während der Spieler in der Nähe ist |
Kurze Antworten
Was ist ein guter resmon-Wert für ein Script?
Ein inaktives Script sollte um 0,00 bis 0,01 ms sitzen. Alles, das deutlich darüber bleibt, wenn du es nicht verwendest, hat eine Schleife, die zu hart arbeitet.
Was macht Wait(0) und warum ist es teuer?
Wait(0) führt die Schleife einmal pro Frame aus. Bei 60 Frames pro Sekunde sind das 60 Durchläufe pro Sekunde, und jede Native, die du darin aufrufst, wird 60 Mal pro Sekunde aufgerufen.
Brauche ich ox_lib, um hohe ms zu beheben?
Nein. Die Behebungen funktionieren in einfacher Lua. ox_lib macht sie nur kürzer, mit cache.ped, lib.points und lib.zones.
Scripts ohne dieses Problem
CCTV Security CamerasPlatzierbare Kameras, ein Live-Tablet mit Multi-View und ausgedruckte Beweisfotos.Script ansehen →
Advanced BoostingFahrzeug-Boosting per Tablet: Aufträge von Klasse D bis S+, Crews und eine Live-Warteschlange.Script ansehen →
Arcade MachinesSieben spielbare Arcade-Games in echten Automaten, mit Bestenlisten und Wetten.Script ansehen →