24/09/2026

FiveM UI หน่วง NUI กิน FPS แจ้งเตือนกระตุก — สาเหตุจริงและวิธีแก้สำหรับเจ้าของเซิฟ

UI ใน FiveM หน่วง เปิดกระเป๋าแล้วเฟรมตก แจ้งเตือนขึ้นช้า HUD กระตุก สาเหตุจริงคือ NUI หลายตัวเปิดค้าง ส่ง message ทุกเฟรม ฟอนต์/CSS โหลดจากเน็ต และ progress bar ที่ล็อกปุ่มไม่ครบ พร้อมวิธีวัดและสคริป UI ฟรีที่แก้แล้ว

ผู้เล่นบอกว่า "เซิฟหน่วง" แต่เซิฟ ping 20 ms และ CPU ว่าง 70% — เกือบทุกครั้งปัญหาคือ UI ฝั่ง client ไม่ใช่เซิฟ NUI ทุกตัวคือหน้าเว็บ Chromium ที่วิ่งซ้อนเกม ยิ่งมีหลายตัว ยิ่งมีตัวที่ทำงานตลอดเวลา เฟรมยิ่งหาย บทความนี้บอกวิธีหาตัวผิด และสิ่งที่ UI ที่ดีต้องทำ

สคริปต์ที่เกี่ยวข้อง

วิธีวัดว่าตัวไหนกิน

  1. กด F8 พิมพ์ resmon 1 — ตาราง CPU/ms ต่อ resource ฝั่ง client เรียงตาม ms ตัวที่เกิน 0.1 ms ตอนยืนนิ่งคือตัวน่าสงสัย
  2. resmon ดู ตอนเปิด UI เช่น กระเป๋า เมนู ถ้า resource กระโดดจาก 0.05 ไป 2–5 ms = UI ตัวนั้นส่ง message ถี่หรือวาดซับซ้อนเกิน
  3. stop <resource> ทีละตัวแล้วดูเฟรม เจอตัวผิดภายใน 5 นาที
  4. ดูจำนวน NUI ที่เปิดค้าง — HUD, แจ้งเตือน, progress bar, เมนู, กระเป๋า, โทรศัพท์ ถ้าทุกตัวเป็น Vue/React แอปเต็มตัวและ แสดงตลอดเวลา (SetNuiFocus ไม่เกี่ยว แค่ render ก็กิน) แค่ 6 ตัวก็หายไป 15–20 FPS บนเครื่องกลาง

6 สาเหตุที่พบบ่อย

1. ส่ง SendNUIMessage ทุกเฟรม

HUD หลายตัวยิงเลือด/อาหาร/เงินไป NUI ใน while true do Wait(0) เท่ากับ serialize JSON + ข้าม process 60 ครั้ง/วินาที ต่อ HUD ตัวเดียว แก้: ส่งเฉพาะเมื่อค่าเปลี่ยน และ Wait(200–500) สำหรับค่าที่ไม่ต้องเรียลไทม์

2. ฟอนต์ / CSS / JS โหลดจากอินเทอร์เน็ต

UI ที่ @import Google Fonts หรือดึง CDN จะ ค้างรอเน็ต ตอนเปิดครั้งแรก และบนเครื่องที่บล็อกหรือเน็ตช้าจะขึ้นกล่องสี่เหลี่ยมแทนตัวอักษรไทย ทุก asset ต้องอยู่ในตัว resource X3D Notify และ X3D Progress Bar ฝัง Noto Sans Thai มาในตัว ไม่มี request ออก

3. NUI หลายตัวทับกัน

esx_notify เดิมกับตัวใหม่เปิดพร้อมกัน แจ้งเตือนขึ้นซ้อน 2 ที่ และกินสองเท่า เอาตัวเดิมออกให้หมด ถ้ามีสคริปต์เก่าเรียก exports['esx_notify'] ใช้ตัวส่งต่อ 12 บรรทัดใน optional/ ของ X3D Notify แทนการรันสองตัว

4. Progress bar ที่ไม่ล็อกปุ่ม

ระหว่างซ่อมรถ ผู้เล่นเปิดกระเป๋า กดเมนู กดโทรศัพท์ได้ UI 3–4 ตัวเรนเดอร์พร้อมกัน ทั้งกินเฟรมทั้งเป็นช่องดูป ตัวแก้คือ progress bar ต้องประกาศสถานะให้ทุก UI รู้ X3D Progress Bar ตั้ง state bag LocalPlayer.state.minigame และยิง event x3d_progressbar:active UI อื่นเช็กบรรทัดเดียว:

if LocalPlayer.state.minigame then return end

5. animation / blur / backdrop-filter หนัก

backdrop-filter: blur() เต็มจอ กับ box-shadow ซ้อนหลายชั้นบน element ที่ขยับทุกเฟรม ทำให้ Chromium ที่ซ้อนเกมอยู่ต้อง composite ใหม่ทั้งจอ ใช้ blur เฉพาะกล่องเล็ก ใช้ transform/opacity แทน top/left และเปิด will-change เฉพาะตอน animate

6. UI ที่ยังไม่ปิดจริง

ซ่อนด้วย display:none ฝั่ง JS แต่ Lua ยังส่ง message และ Vue ยัง reactive อยู่ ต้องหยุด loop ฝั่ง Lua ด้วยเมื่อปิด UI

UI ที่ดีสำหรับเซิฟไทยต้องมี

ต้องมี ทำไม
ฟอนต์ไทยฝังในตัว ไม่ขึ้นกล่องสี่เหลี่ยม ไม่รอเน็ต
ไม่มี request ออกนอกเครื่อง เปิดครั้งแรกไม่ค้าง
ส่ง message เฉพาะเมื่อค่าเปลี่ยน ไม่กินเฟรมตอนยืนนิ่ง
ประกาศสถานะ (state bag) UI อื่นหยุดทับกันเองได้
ยกเลิกได้ (ESC) ผู้เล่นไม่ค้างในแถบ
ใช้ของเดิมทดแทนได้โดยไม่แก้สคริปต์ เปลี่ยนแล้วไม่พังทั้งเซิฟ

สามตัวฟรีของ X3D ทำครบตามตาราง: X3D Notify แทน esx_notify · X3D Progress Bar แทน esx_progressbar · X3D Loading Screen แทน esx_loadingscreen วิธีสลับโดยไม่แก้สคริปต์เก่าอยู่ในบทความเทียบ UI มาตรฐาน ESX

ฝั่งผู้เล่นที่ FPS ตกทุกเซิฟ (ไม่ใช่เฉพาะเซิฟคุณ) ส่งFiveM FPS ตก ล็อค 60 แก้ยังไงให้ไล่ตั้งค่าเครื่อง

ถ้าอยากได้ UI แบรนด์ตัวเอง

อยากเปลี่ยนแค่ UI กระเป๋า FiveM ใช้ของฟรีที่ทำตามหลักในบทความนี้ได้เลย: UI กระเป๋า FiveM ฟรี พร้อมตู้เซฟและท้ายรถ

HUD/เมนู/กระเป๋าที่ออกแบบเฉพาะเซิฟ ทีม X3D รับออกแบบและเขียน UI/NUI ด้วย Vue ตามหลักในบทความนี้: ฝังฟอนต์ ไม่มี request ออก ส่งเฉพาะที่เปลี่ยน วัด resmon ก่อนส่งมอบ

คำถามที่พบบ่อย

เปลี่ยน HUD แล้วยังหน่วง — วัด resmon ใหม่ ส่วนใหญ่ตัวกินไม่ใช่ HUD แต่เป็นสคริปต์ที่วน Wait(0) เช่น ระบบวาดป้าย 3D ทุกจุดในเมืองพร้อมกัน

ปรับกราฟิกช่วยไหม — ช่วยเรื่องเกม ไม่ช่วยเรื่อง NUI ตัว NUI วิ่งบน CPU/Chromium แยกจากตัวเกม

ปิด NUI ทั้งหมดได้ไหม — ได้เฉพาะตอน debug: stop ทีละตัว หรือใช้ nui_devtools ดู performance ของแต่ละหน้า

สคริปต์ที่เกี่ยวข้อง