FiveM OneSync คืออะไร? วิธีทำงานของ Entity, Scope, Routing Bucket และ State Awareness

 FiveM OneSync คือระบบ Network Synchronization ของ FiveM ที่พัฒนาขึ้นบนพื้นฐานระบบเครือข่ายของ GTA Online เพื่อรองรับผู้เล่นจำนวนมากขึ้น พร้อมเพิ่มความสามารถด้าน Server-side Entity Synchronization, State Awareness, Entity Scope, Routing Buckets และ Server-created Entities สำหรับ Developer และ Server Owner.

สำหรับการตั้ง FXServer แบบ Vanilla ปัจจุบัน Cfx.re ยังแสดง set onesync on ในตัวอย่าง server.cfg และระบุว่า OneSync จำเป็นสำหรับ Server-side State Awareness.

Meta SEO

Meta Title: FiveM OneSync คืออะไร? Entity, Scope, Routing Bucket และ State Awareness

Meta Description: อธิบาย FiveM OneSync แบบละเอียด วิธีทำงานของ Entity Sync, Scope, Culling, Network ID, Routing Bucket, Entity Lockdown และ State Awareness พร้อมวิธีตั้งค่า Server

Focus Keyword: FiveM OneSync

Related Keywords: FiveM OneSync Infinity, FiveM Routing Bucket, FiveM Entity Sync, FiveM State Awareness, FiveM Network ID, FiveM OneSync Server

สารบัญ

① FiveM OneSync คืออะไร

OneSync เป็นระบบ Synchronization ของ FiveM สำหรับจัดการข้อมูลผู้เล่นและ Networked Entities ระหว่าง Server กับ Clients

Cfx.re ระบุว่า OneSync นอกจากเพิ่มจำนวน Player Slots แล้ว ยังเพิ่มมาตรฐานการพัฒนาที่ดีขึ้น เช่น Server-sided Synchronization State สำหรับ Entities.

พูดง่ายๆ คือ OneSync เป็นหนึ่งในระบบหลักที่ช่วยตอบคำถามว่า:

Entity นี้อยู่ที่ไหน
ใครเป็น Owner
Player คนไหนควรเห็น Entity นี้
State อะไรต้อง Sync
Entity อยู่ Instance ไหน
Server ควบคุม Entity ได้แค่ไหน

② OneSync สำคัญกับ FiveM Server อย่างไร

Server สมัยใหม่สามารถใช้ OneSync เพื่อทำงานประเภท:

  • Server-side Entity Creation

  • Entity Synchronization

  • State Bags

  • Routing Buckets

  • Entity Lockdown

  • Player/Entity Scope

  • Server-side Entity Natives

  • Server-authoritative Logic มากขึ้น

ความสามารถหลายส่วนเหล่านี้ถูกรวมอยู่ใน OneSync Documentation ของ Cfx.re โดยตรง.

③ OneSync Infinity คืออะไร

Cfx.re อธิบาย OneSync Infinity ว่าเป็นโหมดที่รองรับผู้เล่นได้สูงสุดในระดับ 2048 Players และใช้เทคนิค Culling/Focus Zone เพื่อลดจำนวน Players และ Entities ที่ Client แต่ละเครื่องจำเป็นต้องสร้างและติดตาม.

แนวคิดสำคัญคือ:

Server มี Player จำนวนมาก
↓
Client ไม่จำเป็นต้องรับทุก Entity
↓
ส่งเฉพาะสิ่งที่เกี่ยวข้องกับบริเวณ Player
↓
ลดข้อมูล Synchronization ที่ไม่จำเป็น

④ OneSync รองรับผู้เล่นสูงสุดกี่คน

Server Commands ปัจจุบันระบุว่า sv_maxClients รองรับค่าตั้งแต่ 1 ถึง 2048 และจำนวน Slots สูงขึ้นมี Requirement เกี่ยวกับ OneSync.

OneSync Documentation ยังระบุว่า OneSync ใช้งานฟรีถึง 48 Slots และจำนวนที่สูงกว่านั้นต้องตรวจ Tier ที่เหมาะสมผ่าน Cfx Portal.

ดังนั้นอย่าดูเพียง CPU/RAM แต่ต้องตรวจ Slot/Tier Requirements ปัจจุบันด้วย

⑤ วิธีเปิด OneSync

ตัวอย่าง Vanilla server.cfg ปัจจุบันของ Cfx.re ใช้:

set onesync on

และมี Comment กำกับว่า OneSync จำเป็นสำหรับ Server-side State Awareness.

ตัวอย่าง:

set onesync on
sv_maxclients 48

⑥ จะรู้ได้อย่างไรว่า OneSync เปิดอยู่

เริ่มจากตรวจ server.cfg ว่ามี:

set onesync on

จากนั้นตรวจว่า Config ที่ Server ใช้จริงถูก Execute หรือไม่

อย่าแก้ server.cfg ผิด Profile เพราะ txAdmin สามารถมี Server Data/Profile หลายชุดได้

⑦ OneSync Legacy ยังควรใช้ไหม

สำหรับ Server ปัจจุบันควรอิง Documentation ล่าสุดและใช้ Configuration ที่ Cfx.re แนะนำแทน Tutorial เก่า

Server Commands ปัจจุบันยังกล่าวถึง Compatibility ของ on และ legacy บางช่วง Slot แต่การตั้ง Vanilla Server ทางการใช้:

set onesync on

⑧ State Awareness คืออะไร

State Awareness ทำให้ Server มีความเข้าใจเกี่ยวกับ Networked Entity State มากขึ้น และทำให้ Server-side Entity Handles และ State Bags สามารถใช้งานได้ตาม Context ที่รองรับ.

นี่คือเหตุผลที่ OneSync สำคัญกับ Server-side Scripting สมัยใหม่

⑨ State Bags เกิดขึ้นภายใต้ State Awareness

Cfx.re ระบุว่าเมื่ออยู่ใน State Awareness Mode Entities สามารถมี Key/Value State ที่เรียกว่า State Bags.

ตัวอย่าง:

Vehicle
├── garage:locked = true
└── garage:owner = 25

State นี้สามารถถูกใช้โดย Resources ที่เกี่ยวข้องตาม Replication Policy

⑩ Entity Handle คืออะไร

Entity Handle คือค่าที่ใช้แทน Entity เช่น:

  • Ped

  • Vehicle

  • Object

แต่ Cfx.re เตือนว่า Entity Handle เป็น Local ต่อ Client และไม่ควรคาดหวังว่า Entity เดียวกันจะมี Handle เดียวกันบนทุกเครื่อง.

นี่เป็นข้อผิดพลาดที่ Developer มือใหม่เจอบ่อยมาก

⑪ Network ID คืออะไร

ถ้าต้องอ้าง Entity ข้ามเครื่อง ควรใช้ Network ID

Cfx.re ระบุว่า Network ID เป็นค่า 16-bit ที่แทน Networked Entity ในช่วงเวลาหนึ่ง และระหว่าง Lifetime ของ Entity ค่า Network ID จะไม่เปลี่ยน แม้เลขดังกล่าวสามารถถูกนำกลับมาใช้ใหม่หลัง Entity เดิมหมดอายุแล้ว.

⑫ Entity Handle กับ Network ID ต่างกันอย่างไร

จำง่ายๆ:

Entity Handle

ใช้ภายใน Machine/Context นั้น

Network ID

ใช้ระบุ Network Entity ข้าม Client/Server

Cfx.re แนะนำว่า หากต้องอ้าง Entity ข้าม Machines ให้ใช้ Network ID.

⑬ แปลง Entity เป็น Network ID อย่างไร

FiveM มี Natives สำหรับแปลงระหว่าง:

Entity Handle
↕
Network ID

เช่นแนวคิด:

local netId = NetworkGetNetworkIdFromEntity(entity)

และอีกฝั่งสามารถแปลงกลับเมื่อ Entity อยู่ใน Scope.

⑭ Network ID มีแล้ว Entity ต้องมีอยู่บน Client ไหม

ไม่จำเป็น

Cfx.re ระบุว่า Network ID อาจยังไม่อยู่ใน Scope ของ Client นั้น และควรตรวจ Entity Exist ก่อนใช้งาน.

นี่สำคัญมากกับ OneSync เพราะ Clients ไม่ได้เห็น Entities ทุกตัวใน Server พร้อมกัน

⑮ Scope คืออะไรใน OneSync

Scope หมายถึงชุด Players/Entities ที่เกี่ยวข้องและอยู่ในขอบเขต Synchronization ของ Client ในช่วงนั้น

OneSync ใช้ Culling เพื่อไม่ส่งข้อมูลทุกอย่างใน Server ให้ Client ทุกคน.

⑯ Culling คืออะไร

Cfx.re อธิบายว่า Culling ใช้ลดข้อมูลที่ไม่จำเป็น โดย Client สนใจสิ่งที่เกิดขึ้นในบริเวณใกล้ตัวมากกว่า Entities ที่อยู่ไกลมาก.

ผลคือ:

Player A อยู่เมืองส่วนหนึ่ง
Player B อยู่ไกลมาก
↓
Client A ไม่จำเป็นต้องสร้าง/Sync ทุก Entity รอบ Player B

ช่วยลด Network และ Processing Load

⑰ Default Culling Radius เท่าไร

OneSync Documentation ปัจจุบันระบุ Default Culling Radius ที่ประมาณ 424 Units.

อย่างไรก็ตาม Cfx.re ระบุด้วยว่า Culling Radius Natives บางตัว Deprecated และมี Known Issues จึงไม่ควรปรับ Radius แบบสุ่มเพื่อแก้ปัญหา Networking.

⑱ Player อยู่ Server แต่ Client หาไม่เจอได้ไหม

ได้

Cfx.re ระบุว่า Player ที่มีอยู่บน Server ไม่จำเป็นต้อง Exist บน Client ทุกเครื่อง และ GET_PLAYER_FROM_SERVER_ID สามารถคืน -1 หาก Player นั้นไม่ได้อยู่ใน Context/Scope ของ Client.

จึงไม่ควร Loop Player ฝั่ง Client แล้วสมมติว่าจะเห็นผู้เล่นทุกคนใน Server

⑲ Player Index คืออะไร

Client มี Player Index สำหรับอ้าง Player ที่ Client มองเห็น และ Cfx.re ระบุว่าใน State Awareness Mode Player Indices เป็น Local ต่อ Client.

ฝั่ง Server ไม่มี Player Index แบบเดียวกัน ให้ใช้ Server ID

⑳ Server ID คืออะไร

Cfx.re ระบุ Server ID หรือ NetID ของ Player ว่าเป็น Transient Handle ที่ Server Scripts มักเห็นผ่าน:

source

อย่าใช้ source เป็น Persistent Account ID

㉑ playerEnteredScope คืออะไร

Cfx.re มี Event:

playerEnteredScope

สำหรับกรณี Player เข้า Scope ของ Player อีกคน.

แต่ Documentation มี Performance Warning ชัดเจน

㉒ playerLeftScope คืออะไร

Event:

playerLeftScope

เกิดเมื่อ Player ออกจาก Scope ของ Player อีกคน.

แต่ไม่ควรใช้ Event นี้เป็น Default Solution สำหรับระบบที่ต้อง Scale

㉓ ทำไม Cfx.re ไม่แนะนำ Scope Events

Cfx.re ระบุว่า playerEnteredScope และ playerLeftScope มี Scaling Performance Costs เพราะจะถูกเรียกเพิ่มตามจำนวน Players ที่อยู่ใน Scope.

Documentation แนะนำว่า ถ้าต้องการ Scoped State/Event ควรพิจารณา State Bags แทนเมื่อทำได้.

㉔ State Bags ดีกว่า Scope Event เมื่อไหร่

ถ้าต้องการให้ Player ที่เห็น Entity รู้ว่า:

รถล็อกหรือไม่
Player มีสถานะอะไร
Entity อยู่ State ไหน

State Bags มักเหมาะกว่า Event เข้า/ออก Scope จำนวนมาก

Cfx.re แนะนำ State Bag Change Handler สำหรับกรณี Scoped State โดยตรง.

㉕ Routing Bucket คืออะไร

Routing Bucket เป็นระบบแยก Game State คล้ายแนวคิด Dimension / Virtual World

Player หรือ Entity สามารถถูกกำหนดเข้า Bucket และจะเห็น Players/Entities ที่อยู่ Bucket เดียวกัน.

ตัวอย่าง:

Bucket 0
├── Player A
├── Player B
└── Vehicle A

Bucket 10
├── Player C
└── Vehicle B

Player A จะไม่เห็น Player C เพียงเพราะอยู่พิกัดเดียวกัน หากอยู่คนละ Bucket

㉖ Routing Bucket ใช้ทำอะไร

Cfx.re ยก Use Cases เช่น:

  • Multi-mode Server

  • Session/Party System

  • Character Selection Instance

จึงเหมาะมากกับระบบ Instance

㉗ Routing Bucket ใช้ทำ Character Selection ได้ไหม

ได้

Cfx.re ระบุ Character Screen ที่ถูก Instance แยกจาก Gameplay เป็นหนึ่งในตัวอย่าง Use Case ของ Routing Buckets.

ตัวอย่างแนวคิด:

Player Connecting
↓
Bucket Character Selection
↓
เลือก Character เสร็จ
↓
ย้ายกลับ Gameplay Bucket

㉘ Routing Bucket ใช้ทำ Party Instance ได้ไหม

ได้

Session/Party System เป็น Use Case ที่ Cfx.re ระบุโดยตรง.

เหมาะกับกิจกรรมที่ผู้เล่นบางกลุ่มต้องอยู่ใน Game State แยกจากกลุ่มอื่น

㉙ Routing Bucket ใช้กับ Interior ควรไหม

Cfx.re ระบุชัดว่า Interiors ไม่ใช่ Use Case ที่ควรใช้ Routing Bucket โดยตรง และแนะนำระบบ Conceal/Scoped Solutions ที่เหมาะกับ Interior มากกว่า.

ดังนั้นอย่าใช้ Bucket กับทุกพื้นที่ Instanced เพียงเพราะทำได้ง่าย

㉚ ย้าย Player เข้า Routing Bucket อย่างไร

แนวคิด Native:

SetPlayerRoutingBucket(source, bucketId)

Cfx.re ใช้ Function นี้ในตัวอย่าง OneSync อย่างเป็นทางการ.

ตัวอย่าง:

SetPlayerRoutingBucket(source, 10)

㉛ ย้าย Entity เข้า Routing Bucket อย่างไร

ใช้แนวคิด:

SetEntityRoutingBucket(entity, bucketId)

ตัวอย่าง Official OneSync ใช้ให้ Vehicle อยู่ Bucket เดียวกับ Player.

ต้องจัด Player และ Entity ให้สอดคล้องกันตาม Gameplay Architecture

㉜ Routing Bucket มี Population แยกหรือไม่

Cfx.re ระบุว่าแต่ละ Routing Bucket มี World Grid ของตัวเองสำหรับ Population Owners.

และสามารถปิด Population ภายใน Bucket ได้ด้วย Native ที่เกี่ยวข้อง

㉝ ปิด Population ใน Bucket ได้ไหม

ได้

ตัวอย่าง Official:

SetRoutingBucketPopulationEnabled(1, false)

เหมาะกับ Instance ที่ไม่ต้องการ Population Entities ตาม Environment

㉞ Entity Lockdown คืออะไร

Entity Lockdown ใช้ควบคุมว่า Clients สามารถสร้าง Entities ภายใน Environment/Bucket ได้ระดับไหน

Cfx.re ระบุว่า Entity Lockdown สามารถทำให้ Server มี Control มากขึ้นเหนือ Entity Creation.

㉟ Lockdown Mode มีอะไรบ้าง

OneSync Documentation ปัจจุบันระบุ Modes เช่น:

Modeความหมาย
fullจำกัด Dummy Object Creation เพิ่มเติม และใช้ได้ใน FiveM for GTAV Enhanced
strictClient ไม่สามารถสร้าง Entities ได้
relaxedจำกัด Script-owned Entities ที่ Client สร้าง
inactiveClient สามารถสร้าง Entities ได้

㊱ strict mode ทำอะไร

เมื่อ Routing Bucket ถูกตั้งเป็น:

SetRoutingBucketEntityLockdownMode(bucketId, 'strict')

Client ภายใน Bucket นั้นจะไม่สามารถสร้าง Entities ฝั่ง Client ตาม Policy ของ Lockdown Mode.

เหมาะกับ Architecture ที่ต้องการให้ Server เป็นผู้สร้าง Entities หลัก

㊲ Entity Lockdown กับ State Bag Strict Mode เหมือนกันไหม

ไม่เหมือนกัน

Entity Lockdown

ควบคุม Entity Creation/Ownership Policy

sv_stateBagStrictMode

ควบคุมการแก้ Replicated State Bags จาก Client

เป็นคนละระบบ แม้มีเป้าหมายร่วมในการเพิ่ม Server Authority

㊳ Routing Bucket กับ Entity Lockdown ใช้ร่วมกันได้ไหม

ได้

Cfx.re มีตัวอย่าง:

SetRoutingBucketEntityLockdownMode(1, 'strict')
SetPlayerRoutingBucket(source, 1)
SetEntityRoutingBucket(vehicle, 1)
SetRoutingBucketPopulationEnabled(1, false)

นี่ทำให้ Bucket มีทั้ง Isolation และ Entity Policy ของตัวเอง

㊴ OneSync สร้าง Entity จาก Server ได้ไหม

ได้

Cfx.re ระบุว่า OneSync สามารถสร้าง Entities เช่น:

  • Peds

  • Vehicles

  • Objects

จาก Server ได้.

นี่เป็นหนึ่งในความสามารถสำคัญของ Server-side State Awareness

㊵ ทำไม Server-created Entity ถึงสำคัญ

แนวทางนี้ทำให้ Server เป็นแหล่งควบคุม Entity หลักได้มากขึ้น

ตัวอย่าง Architecture:

Player ขอสร้าง Entity
↓
Server ตรวจเงื่อนไข
↓
Server สร้าง Entity
↓
OneSync Sync Entity
↓
Clients ที่เกี่ยวข้องเห็น Entity

ดีกว่าปล่อยให้ Client สร้าง Entity สำคัญโดยไม่มีการตรวจ

㊶ Persistent Entity ทำอย่างไร

OneSync Documentation แนะนำว่า หากต้องการให้ Server ไม่ลบ Entity สามารถใช้ SetEntityOrphanMode ด้วย KeepEntity Flag ตามกรณี.

ตัวอย่าง Official ใช้:

SetEntityOrphanMode(entity, 2)

กับ Server-created Entities.

㊷ Persistent Entity แปลว่าอยู่หลัง Server Restart ไหม

ไม่ใช่

Persistence ในบริบทนี้หมายถึง Entity Lifecycle ระหว่าง Server Runtime ไม่ใช่ Persistent Database Storage ข้าม FXServer Restart

ถ้าต้องการให้ Vehicle หรือ Object กลับมาหลัง Server Restart ต้องบันทึกข้อมูลที่จำเป็นไว้ใน Persistent Storage แล้วสร้าง Entity ใหม่

㊸ RPC Native คืออะไร

Cfx.re ระบุว่า Server-side Natives บางตัวเป็น RPC Natives ซึ่งคำสั่งอาจถูก Execute บน Client ที่เป็น Owner ของ Entity และการเรียกแบบนี้ไม่รับประกันว่าจะสำเร็จทุกครั้ง.

ดังนั้นหากมี Server Setter Native ที่เหมาะสมควรตรวจ Documentation ก่อนเลือกใช้ Native

㊹ CreateVehicleServerSetter ต่างจาก CreateVehicle อย่างไร

OneSync Documentation ใช้ CreateVehicleServerSetter เป็นตัวอย่าง Server-side Entity Creation และแยกจาก RPC-style Native บางประเภท.

สำหรับระบบที่ต้องการ Server-authoritative Entity Creation ควรเลือก Native ที่ออกแบบเหมาะกับ Server Context

㊺ OneSync กับ State Bags เกี่ยวข้องกันอย่างไร

State Bags ทำงานภายใต้ State Awareness และช่วยแนบ Key/Value State เข้ากับ Entity, Player หรือ Global State.

ดังนั้น OneSync + State Bags เหมาะกับ Architecture:

Server สร้าง Entity
↓
Server กำหนด State
↓
OneSync Sync Entity
↓
State Bag Sync State
↓
Client อ่านสถานะ

㊻ OneSync กับ Network Events ต่างกันอย่างไร

OneSync เป็น Network Synchronization System ระดับกว้าง

Network Events เช่น:

TriggerServerEvent
TriggerClientEvent

ใช้ส่ง Action/Data ระหว่าง Scripts

ส่วน State Bags ใช้ Sync Runtime State และ OneSync จัดการ Network Entity/Scope ในระดับระบบ

ทั้งหมดสามารถทำงานร่วมกันได้

㊼ Network ID ควรใช้กับ State Bags หรือไม่

State Bag สามารถผูกกับ Entity โดยตรงหลัง Resource ได้ Entity Handle ที่ถูกต้อง

แต่เมื่อต้องส่งการอ้างอิง Entityข้าม Client/Server ให้ใช้ Network ID แทนการส่ง Local Entity Handle เพราะ Cfx.re ระบุว่า Entity Handles เป็น Local ต่อแต่ละ Client.

㊽ OneSync ใน FiveM for GTAV Enhanced ต่างจาก Legacy อย่างไร

Documentation ปัจจุบันของ Cfx.re ระบุว่าใน FiveM for GTAV Enhanced:

  • P2P Synchronization ถูกแทนด้วย Client-server Model

  • OneSync Non-big Mode ถูกนำออก

  • Big Mode เป็นโหมด OneSync ที่เหลืออยู่

ดังนั้น Tutorial OneSync เก่าบางส่วนอาจไม่ตรงกับ Enhanced

㊾ Entity Lockdown ใน GTAV Enhanced มีอะไรใหม่

Cfx.re ระบุ Lockdown Mode ใหม่ชื่อ:

full

สำหรับ FiveM for GTAV Enhanced ซึ่งใช้จำกัด Dummy Object Creation เพิ่มเติม.

หากพัฒนา Resource ให้รองรับทั้ง Legacy และ Enhanced ควรตรวจ Compatibility ของ Configuration/Natives

㊿ Checklist FiveM OneSync สำหรับ Server Owner

ตรวจว่า:

  1. set onesync on

  2. ใช้ FXServer Version ปัจจุบัน

  3. sv_maxclients สอดคล้องกับ OneSync/Tier

  4. เข้าใจ Server ID กับ Player Index

  5. ไม่ส่ง Entity Handle ข้ามเครื่อง

  6. ใช้ Network ID สำหรับ Network Entities

  7. ตรวจ Entity Exists ก่อนใช้ NetID

  8. ใช้ Server-created Entities เมื่อเหมาะสม

  9. ใช้ State Bags สำหรับ Runtime State

  10. หลีกเลี่ยง Scope Events หาก State Bags เหมาะกว่า

  11. ใช้ Routing Buckets สำหรับ Instance ที่เหมาะสม

  12. ไม่ใช้ Routing Buckets แทน Interior System แบบสุ่ม

  13. จัด Entity Lockdown ตาม Architecture

  14. ไม่เพิ่ม Culling Radius แบบสุ่ม

  15. Cleanup Entities ที่ไม่ใช้

  16. ตรวจ Entity Ownership

  17. ตรวจ Client F8

  18. ตรวจ Server Console

  19. ทดสอบ Player หลายคน

  20. ทดสอบ Resource กับ GTAV Version ที่ Server รองรับ

ตารางระบบสำคัญของ OneSync

ระบบหน้าที่
OneSyncNetwork Synchronization หลัก
State AwarenessServer เข้าใจ Entity State
Entity HandleLocal Entity Reference
Network IDอ้าง Entity ข้าม Network
Cullingลด Entity/Data ที่ Client ไม่จำเป็นต้องเห็น
Scopeขอบเขต Players/Entities ที่ Client เกี่ยวข้อง
Routing Bucketแยก Game State/Instance
Entity Lockdownควบคุม Entity Creation
State BagsSync Runtime Key/Value State
Server-created Entityให้ Server สร้าง Entity

ข้อมูลเหล่านี้อ้างอิงจาก OneSync, Network IDs และ State Bags Documentation ปัจจุบันของ Cfx.re.

ตัวอย่างเปิด OneSync ใน server.cfg

set onesync on
sv_maxclients 48

ตัวอย่าง Vanilla Configuration ของ Cfx.re ใช้ set onesync on และระบุว่า OneSync จำเป็นสำหรับ Server-side State Awareness.

ตัวอย่าง Routing Bucket พื้นฐาน

local bucketId = 10

SetPlayerRoutingBucket(source, bucketId)

Player จะถูกย้ายเข้า Bucket ตาม ID ที่กำหนด โดย Routing Buckets แยก Players และ Entities ออกจาก Bucket อื่นตาม Game State.

ตัวอย่าง Routing Bucket + Entity

local bucketId = 10

SetPlayerRoutingBucket(source, bucketId)
SetEntityRoutingBucket(vehicle, bucketId)

แนวคิดนี้ทำให้ Player และ Vehicle อยู่ Instance เดียวกัน.

ตัวอย่าง Bucket แบบ strict

local bucketId = 10

SetRoutingBucketEntityLockdownMode(
    bucketId,
    'strict'
)

SetRoutingBucketPopulationEnabled(
    bucketId,
    false
)

SetPlayerRoutingBucket(
    source,
    bucketId
)

Cfx.re ใช้ Structure ลักษณะเดียวกันใน OneSync Entity Lockdown Example.

FiveM OneSync เปิดไม่ได้ แก้อย่างไร

ตรวจตามลำดับ:

server.cfg
↓
set onesync on
↓
Config ถูก Execute?
↓
FXServer Version
↓
Console Error
↓
Resource Compatibility

Vanilla FXServer Documentation ปัจจุบันยังใช้ set onesync on เป็น Configuration มาตรฐาน.

FiveM OneSync เปิดแล้ว Resource พัง

Resource เก่าบางตัวอาจเขียนโดยสมมติ Player/Entity Networking แบบเก่า

ตรวจ:

  • Client Player Loops

  • Entity Handles

  • Network IDs

  • Scope Assumptions

  • Entity Ownership

  • Deprecated Culling Natives

  • State Bags

โดยเฉพาะการส่ง Local Entity Handle ระหว่าง Clients เป็นแนวคิดที่ผิด เพราะ Handle ของ Entity เดียวกันไม่จำเป็นต้องเหมือนกันในแต่ละเครื่อง.

FiveM Network ID หา Entity ไม่เจอ

อย่าคิดว่า NetID มีแล้ว Entity ต้องอยู่บน Client

Cfx.re ระบุว่า Network Entity อาจยังไม่อยู่ใน Scope ของ Client และควรตรวจการมีอยู่ก่อนใช้.

ปัญหาอาจเป็น:

Entity อยู่นอก Scope
Entity ถูกลบ
NetID ถูกใช้ผิด
Client ยังไม่ได้ Create Entity

FiveM Player ID ขึ้น -1

ถ้า Client ใช้ GET_PLAYER_FROM_SERVER_ID แล้วได้ -1 อาจหมายถึง Player นั้นไม่ได้ Exist ใน Client Context/Scope ปัจจุบัน แม้ยังอยู่บน Server.

อย่าใช้ Loop ฝั่ง Client เพื่อพยายามจัดการ Player ทั้ง Server

FiveM playerEnteredScope ใช้ดีไหม

Cfx.re ไม่แนะนำเป็น Default Solution สำหรับระบบที่ต้อง Scale เนื่องจาก Event มี Performance Cost เพิ่มตามจำนวน Players ใน Scope.

หาก Use Case เป็น State Synchronization ให้พิจารณา State Bags และ State Bag Change Handler ก่อน

FiveM Routing Bucket Player ไม่เห็นกัน

นี่อาจเป็น Behavior ที่ถูกต้อง

Player ที่อยู่ต่าง Routing Buckets จะไม่เห็น Players/Entities ของ Bucket อื่น แม้อยู่ตำแหน่งเดียวกัน.

ตรวจด้วยว่า Resource ลืมย้าย Player กลับ Bucket หลักหรือไม่

FiveM Routing Bucket รถหาย

ตรวจ:

Player Bucket = ?
Vehicle Bucket = ?

ถ้า Player อยู่ Bucket 10 แต่ Vehicle อยู่ Bucket 0 ผู้เล่นอาจไม่เห็น Entity นั้นตาม Routing Isolation.

ควรจัด Bucket ของ Entity และ Player ให้ตรงกับ Gameplay Design

FiveM OneSync ทำ Server Lag ไหม

OneSync เองใช้ Culling เพื่อลดข้อมูลที่ Clients ไม่จำเป็นต้องรับ และ Cfx.re ระบุว่านี่ช่วยลด Server Load และรองรับ Clients จำนวนมากขึ้น.

แต่ Resource ที่เขียนไม่ดีสามารถสร้างปัญหาได้ เช่น:

  • Spawn Entities มากเกินไป

  • Loop Players/Entities ถี่เกินไป

  • Scope Events จำนวนมาก

  • State Update ถี่เกินความจำเป็น

  • Network Events ขนาดใหญ่

จึงควรแยก OneSync Problem ออกจาก Resource Performance Problem

FiveM Entity Ownership คืออะไร

Networked Entity สามารถมี Client ที่รับผิดชอบการควบคุมในบางช่วง และ Ownership สามารถเปลี่ยนเมื่อ Entity เคลื่อนออกจาก Scope หรือมีการ Migration

Cfx.re ระบุว่า Entity ที่ออกนอก Range สามารถถูก Culled และ Migrated/Disowned ได้.

จึงไม่ควรเขียน Script โดยสมมติ Owner จะเป็น Client เดิมตลอดเวลา

FiveM Server-created Entity ดีกว่า Client-created Entity ไหม

ไม่ใช่ว่าดีกว่าทุกกรณี แต่ Cfx.re ระบุ Server-created Entities เป็น Best Practice ของ OneSync สำหรับการสร้าง Peds, Vehicles และ Objects ที่ Server ต้องควบคุม.

สำหรับ Entity สำคัญ ควรพิจารณาให้ Server Validate Request และสร้าง Entity เอง

FAQ FiveM OneSync

FiveM OneSync คืออะไร

เป็นระบบ Network Synchronization ของ FiveM ที่รองรับจำนวนผู้เล่นมากขึ้นและเพิ่ม Server-side Synchronization State สำหรับ Entities.

FiveM OneSync เปิดอย่างไร

Vanilla server.cfg ของ Cfx.re ใช้:

set onesync on

OneSync Infinity รองรับกี่คน

Documentation ระบุโหมดที่รองรับได้สูงสุดถึง 2048 Players ส่วน Slot/Tier ที่ใช้งานจริงต้องตรงกับ Server Configuration และ Cfx Portal Requirements.

Entity Handle กับ Network ID ต่างกันอย่างไร

Entity Handle เป็น Local Reference ของแต่ละ Client ส่วน Network ID ใช้ระบุ Networked Entity ข้ามเครื่อง.

Routing Bucket คืออะไร

เป็นระบบ Instance/Dimension ที่ทำให้ Players และ Entities ใน Bucket เดียวกันเห็นกัน โดยแยกจาก Game State ของ Bucket อื่น.

Routing Bucket ใช้ทำ Interior ไหม

Cfx.re ระบุว่า Interior ไม่ใช่ Use Case ที่เหมาะกับ Routing Bucket โดยตรง และควรใช้ Conceal/Scoped Mechanism ที่เหมาะกว่า.

playerEnteredScope ควรใช้ไหม

ใช้ได้ แต่ Cfx.re มี Performance Warning และแนะนำ State Bags สำหรับ Scoped State ในกรณีที่เหมาะสม.

OneSync เกี่ยวกับ State Bags ไหม

เกี่ยวข้อง State Bags ทำงานภายใต้ State Awareness และสามารถเก็บ Runtime Key/Value State ของ Entities, Players และ Global State.

GTAV Enhanced ยังมี OneSync Non-big Mode ไหม

ไม่มี Documentation ปัจจุบันระบุว่า FiveM for GTAV Enhanced ใช้ OneSync Big Mode และ Non-big Mode ถูกนำออกแล้ว.

ประเด็นสำคัญ

FiveM OneSync เป็นระบบ Synchronization หลักที่ทำให้ FXServer สามารถจัดการ Players และ Networked Entities ในรูปแบบที่รองรับ Server-side State Awareness, State Bags, Server-created Entities, Routing Buckets และ Entity Lockdown ได้มากขึ้น.

สิ่งที่ Developer ต้องเข้าใจมากที่สุดคือ Entity Handle ไม่ใช่ Network ID เพราะ Handle เป็น Local ต่อแต่ละ Client ในขณะที่ Network ID ถูกออกแบบสำหรับการอ้าง Entity ข้าม Client/Server และ Network ID อาจไม่อยู่ใน Scope ของ Client ทุกเครื่องตลอดเวลา.

OneSync ยังใช้ Culling เพื่อลดข้อมูลที่ไม่จำเป็น และ Cfx.re เตือนว่า playerEnteredScope/playerLeftScope มี Scaling Performance Costs จึงควรใช้ State Bags สำหรับ Scoped State เมื่อเหมาะสม.

Routing Buckets ใช้แยก Players และ Entities เป็น Instance สำหรับ Use Cases เช่น Multi-mode, Party และ Character Selection ส่วน Entity Lockdown สามารถกำหนดให้ Server มีอำนาจควบคุม Entity Creation มากขึ้น.

สำหรับผู้อ่าน comsiam ให้จำโครงสร้าง “OneSync → Scope → Network ID → Entity → State Bag → Routing Bucket” และ comsiam แนะนำให้ Server Owner เปิด OneSync ตาม Configuration ปัจจุบันของ Cfx.re แล้วออกแบบ Resources ให้ใช้ Server-side Validation, Network IDs และ State Bags อย่างถูกหน้าที่ แทนการยึดแนวทาง Networking จาก Tutorial FiveM รุ่นเก่า

Comments

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด