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 |
strict | Client ไม่สามารถสร้าง Entities ได้ |
relaxed | จำกัด Script-owned Entities ที่ Client สร้าง |
inactive | Client สามารถสร้าง 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
ตรวจว่า:
set onesync onใช้ FXServer Version ปัจจุบัน
sv_maxclientsสอดคล้องกับ OneSync/Tierเข้าใจ Server ID กับ Player Index
ไม่ส่ง Entity Handle ข้ามเครื่อง
ใช้ Network ID สำหรับ Network Entities
ตรวจ Entity Exists ก่อนใช้ NetID
ใช้ Server-created Entities เมื่อเหมาะสม
ใช้ State Bags สำหรับ Runtime State
หลีกเลี่ยง Scope Events หาก State Bags เหมาะกว่า
ใช้ Routing Buckets สำหรับ Instance ที่เหมาะสม
ไม่ใช้ Routing Buckets แทน Interior System แบบสุ่ม
จัด Entity Lockdown ตาม Architecture
ไม่เพิ่ม Culling Radius แบบสุ่ม
Cleanup Entities ที่ไม่ใช้
ตรวจ Entity Ownership
ตรวจ Client F8
ตรวจ Server Console
ทดสอบ Player หลายคน
ทดสอบ Resource กับ GTAV Version ที่ Server รองรับ
ตารางระบบสำคัญของ OneSync
| ระบบ | หน้าที่ |
|---|---|
| OneSync | Network Synchronization หลัก |
| State Awareness | Server เข้าใจ Entity State |
| Entity Handle | Local Entity Reference |
| Network ID | อ้าง Entity ข้าม Network |
| Culling | ลด Entity/Data ที่ Client ไม่จำเป็นต้องเห็น |
| Scope | ขอบเขต Players/Entities ที่ Client เกี่ยวข้อง |
| Routing Bucket | แยก Game State/Instance |
| Entity Lockdown | ควบคุม Entity Creation |
| State Bags | Sync 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
Post a Comment