FiveM resmon yüksek ms: yavaş betikleri nasıl bulacağınız ve düzelteceksiniz
Bir kaynak resmon'da yüksek ms gösteriyor? resmon 1'i nasıl okuyacağınız, Wait(0) döngüleri neden bu kadar maliyetli ve uzakta olduğunuzda nasıl uyuyacağınız, ped'i önbelleğe almanız ve ox_lib noktaları ve bölgeleri kullanın.
Kaynak monitörünü açıyorsunuz ve bir betik bunu gösterir:
my_script 0.35 msBoş bir betik sıfıra yakın olmalıdır. Her çerçevede bir milisaniyenin üçte birini yiyen veya çok daha fazla olan betik oyununuzu kesinti yapar ve daha zayıf bilgisayarları olan oyuncular önce hisseder. Bu kılavuz sorunun hangi kaynağın olduğunu ve onu aşağı getiren değişiklikleri gösterir.
Kaynak monitörünü açın
Oyunun F8 konsolunda yazın:
resmon 1Overlay her istemci kaynağını CPU zamanı (ms) çerçeve başına ve belleği gösterir. Kapatmak için resmon 0 yazın. Bunları kontrol edin:
- Hareketsiz durun, sessiz bir yerde ve listeyi okuyun. Önemli olan sayılar hiçbir şey yapmadığınız zaman yüksek kalan sayılardır.
- Kim en üstte olduğunu bakın. Yalnızca kendi işaretinin veya dükkanının yakınında yukarı giden kaynak normaldir. Her yerde yüksek olanı değil.
- Birkaç saniye izleyin. Betik başladığında tek bir tepe zararsızdır; sabit bir değer sorundur.
ms, istemcide zamandır. Sunucu performansı ayrı bir konudur: bkz. server thread hitch warning.
Neden 1: Wait(0) ile döngü
Yüksek değer için en yaygın neden, her zaman her çerçevede çalışan bir döngüdür:
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)Bu yerleşik işlevleri saniyede 60 kez çalıştırır, oyuncu haritanın diğer tarafında olsa bile. Çoğu zaman cevap "yapacak bir şey yok" ve bu maliyet boşa harcanır.
Düzeltme 1: uzakta olduğunuzda uyuyun
Hiçbir şey yakında olmadığında döngüyü daha uzun uyutun ve yalnızca oyuncu yakınındayken her çerçevede çalıştırın:
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)Döngü uzakta olduğunuzda saniyede bir kez kontrol eder, neredeyse hiçbir maliyeti olmaz ve sadece 10 metrelik alanda çizeceği yerde çerçeve başına çalışır. #(a - b)'i vec3 değerleri ile mesafe için kullanın: eski GetDistanceBetweenCoords yerleşik'den daha hızlıdır.
Düzeltme 2: yeniden kullandığınız değerleri önbelleğe alın
Nadiren değişen bir değeri almak için çerçeve başına yerleşik çağırmak israftır. PlayerPedId() klasik olanıdır. Bir kez saklayın ve yalnızca değişebilirse yenileyin:
local ped = PlayerPedId()
CreateThread(function()
while true do
Wait(500)
ped = PlayerPedId()
end
end)ox_lib kullanırsanız, bunu sizin için yapar. cache.ped güncel tutulur, cache.vehicle ve cache.serverId aynı şekilde çalışır:
local coords = GetEntityCoords(cache.ped)lib.onCache önbelleğe alınan bir değer değiştiğinde tepki vermenizi sağlar, bir döngüde kontrol etmeden.
Düzeltme 3: her çerçevede yerleşik çağırmayı durdurun
Döngünün gövdesini kontrol edin ve her satır için sorun sorun: bu gerçekten her çerçevede çalışması gerekiyor mu? Çıkmazın ne çalışmıyor.
- Çizim (metin, işaretçiler, sprite) her çerçevede çalışmalı, ama sadece görünür olduğu sürece.
- Veri okuma (iş, para, envanter) değil: bir etkinlikte okuyun ve değişkende tutun.
- Arama (
GetClosestVehicle,GetGamePool, tüm oyuncuların döngüsü) pahalıdır. Çerçeve başına her değil, saniyede bir veya iki çalıştırın. - Döngüde şey oluşturmayın: blip, metin girişi veya tablolar oluşturmak her çerçevede hafızayı doldurur ve çöp toplayıcısını çalıştırır.
-- 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)Düzeltme 4: döngüler yerine ox_lib noktaları ve bölgeleri kullanın
Çoğu "bu spot yakın mıyım" döngüsü gerekli değildir. ox_lib mesafe işini yapabilir ve sadece önemli olduğunda kodunuzu çalıştırır.
Bir nokta bir yarıçapa girdiğinizde veya çıktığınızda bir işlevi çağırır ve bir çerçeve içinde sadece içerideyken bir:
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
endBölgeler küre, kutu veya çokgen gibi şekiller için aynı şeyi yapırlar:
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,
})Varlıklar ve noktalar ile etkileşim için, hedef kaynak (example ox_target, örneğin) "E tuşuna bas" döngüsünün yerine geçer. Her birinin tam seçenekleri için ox_lib belgelerine bakın.
Sonucu kontrol edin
resmon 1 tekrar çalıştırın. Düzeltilmiş betik noktalarından uzakta durduğunuzda 0.00 ms yakında oturmalı ve sadece yakınsanız yükselir. Yine de yüksekse, aynı kaynakta ikinci döngüyü arayın: bir Wait(0) genellikle tek olanı değildir.
Dikkat: anahtar basış veya çizim işleyen döngüde uzun uyku ayarlamayın. Uyursanız 500 ms ve oyuncu tuşa basarsa, betik bunu kaçırır. Hiçbir şey yürürlüğe girdiğinde ve bir şey olduğunda
Wait(0)'ye düştüğünüzde sadece uyuyun.
Kontrol listesi
| Belirtisi | Çözüm |
|---|---|
| Boş olduğunda yüksek ms | while true do Wait(0) döngüsünü bulun ve mesafeye dayalı uyku ekleyin |
Her çerçevede PlayerPedId() |
Önbelleğe alın veya ox_lib'den cache.ped kullanın |
| Döngüde mesafe kontrolleri | lib.points.new veya lib.zones ile değiştirin |
| Her çerçevede varlıkları arama | Saniyede bir çalıştırın ve sonucu tutun |
| Döngüde oyuncu verilerini okuma | Çerçeve olayında okuyun ve saklayın |
| Uyku eklendikten sonra kaçırılan tuş basışları | Wait(0) sadece oyuncu yakındayken kullanın |
Kısa yanıtlar
Betik için iyi bir resmon değeri nedir?
Boş bir betik 0.00 ile 0.01 ms etrafında oturmalıdır. Onu kullanmadığınız zaman iyi yukarıda kalan herhangi bir şey çok sıkı çalışan bir döngüsüne sahiptir.
Wait(0) ne yapar ve neden maliyetlidir?
Wait(0) döngüyü çerçeve başına bir kez çalıştırır. Saniye başına 60 çerçevede saniyede 60 çalışmadır ve içinde çağırdığınız herhangi bir yerleşik saniyede 60 kez çalışır.
Yüksek ms düzeltmek için ox_lib'e ihtiyacım var mı?
Hayır. Düzeltmeler düz Lua'da çalışır. ox_lib sadece onları kısaltır, cache.ped, lib.points ve lib.zones ile.
Bu sorunu yaşatmayan scriptler
CCTV Security CamerasYerleştirilebilir kameralar, canlı çoklu görüntü tableti ve basılı delil fotoğrafları.Scripti gör →
Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →
Arcade MachinesGerçek kabinlerde oynanabilir yedi arcade oyunu; skor tabloları ve bahislerle.Scripti gör →