Dalam model otoritas server, server adalah satu-satunya sumber kebenaran untuk seluruh keadaan permainan, dan klien hanya dipercaya untuk melaporkan input mereka sendiri. Arsitektur ini adalah fondasi netcode inti dari permainan yang adil dan kompetitif karena mencegah seluruh kelas kecurangan seperti flyhacks atau speedhacks dengan tidak pernah mempercayai klien untuk melaporkan posisinya sendiri atau keadaan.
Keuntungan
Dalam sistem sederhana yang dimiliki server, klien hanya akan mengirimkan input mereka ke server dan menampilkan hasil permainan yang dikirim kembali oleh server. Meskipun secara teknis benar, sistem semacam itu akan menghadapi latensi input yang signifikan karena setiap aksi pemain harus bepergian ke server, diproses, dan hasilnya dikirim kembali ke klien sebelum dapat ditampilkan. Untuk sebagian besar permainan, terutama yang cepat, keterlambatan perjalanan itu akan menyebabkan gameplay terasa lambat, tidak responsif, dan tidak dapat dimainkan.
Dalam model otoritas server Roblox, latensi dikompensasi dengan cara klien segera memprediksi efek dari input mereka selain mengirimkannya ke server. Misalnya, ketika seorang pemain menekan sebuah tombol, klien tidak menunggu server untuk merespons; sebaliknya, ia memprediksi beberapa frame ke depan dari keadaan server terakhir yang diketahui. Ini memungkinkan klien untuk menunjukkan hasil dari aksi input secara instan, secara efektif menyembunyikan latensi jaringan dan membuat permainan terasa responsif.
Kadang-kadang klien akan salah memprediksi (misprediction) dan, karena latensi jaringan, klien tidak akan tahu bahwa mereka telah membuat kesalahan selama beberapa frame. Misalnya:
Ketika salah prediksi terdeteksi, klien harus memperbaiki prediksinya berdasarkan keadaan otoritatif server. Jika keadaan otoritatif berbeda dari keadaan yang diprediksi klien, klien harus kembali dan mensimulasikan ulang frame-frame yang diprediksinya. Sistem prediksi sisi klien, rollback, dan simulasi ulang ini dikenal sebagai "kompensasi latensi" dan membantu membuat permainan multiplayer yang otoritatif server terasa halus dan responsif.
Pengaturan
Model otoritas server memerlukan teknologi mesin tertentu agar berfungsi dengan benar. Konfirmasikan pengaturan properti berikut pada objek Workspace di Eksplorator:
- Workspace.AuthorityMode harus Server (menyetel ini secara otomatis menyetel lima yang berikut).
- Workspace.NextGenerationReplication harus diaktifkan.
- Workspace.PlayerScriptsUseInputActionSystem harus diaktifkan.
- Workspace.SignalBehavior harus Deferred.
- Workspace.UseFixedSimulation harus diaktifkan.
- Workspace.StreamingEnabled harus diaktifkan.
Konsep
Sistem otoritas server berjalan pada beberapa konsep inti sebagai berikut.
Prediksi Klien
Melalui prediksi klien, klien mensimulasikan beberapa frame di depan keadaan server terakhir yang diketahui untuk memprediksi efek dari input pemain secara langsung. Ini menyembunyikan latensi input, tetapi prediksi tersebut mungkin nanti terbukti tidak benar (misprediction klien) dan karena itu memerlukan koreksi. Klien berusaha untuk mensimulasikan cukup jauh ke depan dari keadaan server otoritatif terakhir yang diketahui sehingga inputnya tiba di server pada frame yang dimaksud. Jumlah frame yang akan diprediksi klien ke depan dari keadaan server yang diketahui tergantung pada latensi antara klien dan server.
Kesalahan Prediksi Klien
Ketika klien menerima keadaan otoritatif dari server, ia memeriksa keadaan itu terhadap catatan historis dari apa yang diprediksinya secara lokal untuk frame itu. Ketika ada perbedaan antara apa yang diprediksi klien dan apa yang sebenarnya dilakukan server, ini adalah kesalahan prediksi. Kesalahan prediksi dapat terjadi karena beberapa alasan, termasuk pergeseran dalam latensi jaringan, pemain lain bertindak dengan cara yang tidak diperkirakan klien, permainan menjalankan logika tertentu secara eksklusif di server, dll.
Jika keadaan otoritatif berbeda dari keadaan yang diprediksi klien, klien harus kembali dan mensimulasikan ulang.
Kembali dan Mensimulasikan Ulang
Ketika klien mendeteksi kesalahan prediksi, ia harus mengatur ulang ke keadaan otoritatif server dan kemudian mensimulasikan ulang untuk melompat kembali ke frame yang diprediksinya. Berdasarkan latensi jaringan, klien mencoba untuk mensimulasikan cukup jauh ke depan dari keadaan server otoritatif terakhir yang diketahui sehingga inputnya tiba di server pada frame yang dimaksud.
Singkatnya, klien:
- Menerima keadaan otoritatif dari server dan membandingkannya dengan keadaan yang diprediksi miliknya sendiri.
- Jika prediksi klien salah:
- Klien kembali ke keadaan otoritatif terakhir yang diketahui dari server.
- Klien mensimulasikan ulang dari keadaan otoritatif ke keadaan yang diprediksi, menerapkan kembali input lokal apapun.
Implementasi
Kepemilikan Jaringan dan Prediksi
Dalam model otoritas server, Anda dapat menjaga objek gameplay inti yang dimiliki server tanpa terkena biaya latensi input yang biasanya terkait dengan kepemilikan server. Hal-hal seperti mobil, karakter pemain, atau objek penting lainnya dapat tetap dimiliki server, bahkan ketika berinteraksi dengan pemain lain.
Secara default, Roblox akan secara otomatis memprediksi properti dengan akses simulasi yang dekat dengan pemain lokal Character, tetapi jika Anda ingin kontrol yang lebih halus, Anda dapat secara eksplisit memaksa prediksi suatu instance dihidupkan atau dimatikan dengan RunService:SetPredictionMode().
Sinkronisasi Simulasi
Dalam model otoritas server, klien dan server harus menjalankan simulasi inti, dan simulasi klien perlu dapat kembali dan mensimulasikan ulang ketika terjadi kesalahan prediksi. Untuk mengaktifkan ini, tulis logika inti Anda di dalam fungsi yang diikat melalui RunService:BindToSimulation() dalam ModuleScript yang diinisialisasi di kedua klien dan server.

Selama simulasi ulang, Roblox akan menjalankan ulang fungsi-fungsi yang diikat ke simulasi melalui BindToSimulation(). Memproses input pemain, berinteraksi dengan objek fisika yang disinkronisasikan, dan memperbarui keadaan permainan inti seharusnya dilakukan di dalam fungsi-fungsi yang diikat tersebut.
ModuleScript bernama Simulasi di ReplicatedStorage:
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local Simulasi = {}
Simulasi.Initialize = function()
RunService:BindToSimulation(function(deltaTime)
-- Baca input pemain
-- Perbarui keadaan permainan
end)
end
return SimulasiSinkronisasi Keadaan dengan Atribut
Roblox secara otomatis menyinkronkan semua properti dengan akses simulasi pada instance yang diprediksi. Untuk data kustom, atribut adalah cara utama untuk menyinkronkan instance yang ditandai sebagai diprediksi; pada instance semacam itu, setiap ketidaksesuaian nilai atribut antara sumber kebenaran server dan prediksi klien akan memicu rollback dan resimulasikan ulang secara penuh.
Batasan Atribut
Agar bisa direplikasi, sebuah atribut harus memenuhi semua kriteria berikut:
- Itu adalah salah satu dari 64 atribut pertama pada Instancenya.
- Namanya berisi paling banyak 50 karakter.
- Jika atribut bertipe string, nilainya berisi paling banyak 50 karakter.
Akses Simulasi
Banyak properti dan metode di referensi API mesin menyertakan label Akses Simulasi, misalnya BasePart.CFrame. Properti dengan label ini akan diprediksi oleh sistem otoritas server. Selain itu, hanya properti dan metode dengan label ini yang dapat diakses di dalam fungsi yang diikat menggunakan RunService:BindToSimulation().
Aksi Input
Dalam permainan yang otoritatif server, cara utama bagi klien untuk mempengaruhi keadaan permainan adalah melalui Sistem Aksi Input. Input-input ini dikirim ke server dan diputar ulang selama simulasi ulang di klien. Oleh karena itu, InputActions harus digunakan untuk semua input yang mempengaruhi simulasi inti dan harus diperiksa sebelum diproses.
Perhatikan bahwa InputContexts harus menjadi keturunan dari Player sehingga mesin mengetahui siapa yang memiliki kepemilikan atas InputContext. Salah satu pendekatan adalah menambahkan InputContexts Anda ke dalam folder di bawah ReplicatedStorage dan menggunakan Script di bawah ServerScriptService untuk mengkloning InputContexts per pemain:

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local InputsFolder = ReplicatedStorage:WaitForChild("Inputs")
local function onPlayerAdded(player)
local clone = InputsFolder:Clone()
clone.Parent = player
end
Players.PlayerAdded:Connect(onPlayerAdded)
for _, player in Players:GetPlayers() do
onPlayerAdded(player)
endDengan pola ini, Anda dapat membaca InputActions untuk semua pemain di RunService:BindToSimulation() di klien dan server untuk menerima data yang sama untuk frame tertentu dan mencatat input frame sebelumnya dalam sebuah atribut, misalnya untuk memicu lari karakter saat aksi input RunAction dipicu.
Remote Events
Event jarak jauh masih dapat digunakan dalam model otoritas server untuk memfasilitasi komunikasi diskrit antara klien dan server. Misalnya, server dapat menggunakan event jarak jauh untuk membroadcast data tentang pemain yang mencetak poin atau mengambil objek, dan klien dapat menggunakan event jarak jauh sebagai API alternatif untuk mengirimkan input ke server, seperti untuk penekanan tombol atau menyentuh objek di dunia 3D.
Animasi, Suara, dan Efek
Efek sisi klien seperti animasi dan suara harus ditulis dengan mengetahui bahwa simulasi klien hanyalah prediksi dari keadaan server yang otoritatif. BindToSimulation() membatasi properti dan metode apa yang dapat dipanggil dari dalam fungsi yang diikat untuk membantu Anda dalam menulis hanya untuk keadaan simulasi yang disinkronkan. Menampilkan hasil dari simulasi ini, memicu efek dan suara, dll., harus dilakukan dalam fungsi terpisah yang terhubung ke RenderStepped yang membaca hasil dari simulasi dan memicu efek yang diinginkan.
Panduan lebih lanjut mengenai rendering simulasi yang diprediksi dibahas dalam panduan teknik lanjutan.
Proyek Contoh
Selain dokumentasi ini, template berikut dapat membantu Anda memulai:


