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:

text
my_script        0.35 ms

Ein 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:

text
resmon 1

Ein 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:

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

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

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

lua
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.
lua
-- 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:

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

Zones tun das gleiche für Formen wie eine Sphäre, eine Box oder ein Polygon:

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

Weiterlesen