Sunucu yetkisi modeli

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Bir sunucu yetkisi modelinde, sunucu tüm oyun durumunun tek doğruluk kaynağıdır ve istemcilerin yalnızca kendi girdilerini bildirmesine güvenilir. Bu mimari, bir istemcinin kendi konumunu veya durumunu bildirmesine asla güvenmeyerek, uçuş hileleri veya hız hileleri gibi hilelerin tüm sınıflarını önlediği için adil ve rekabetçi bir oyunun temel ağ kodu altyapısını oluşturur.

Avantajlar

Sağlıklı bir sunucu sahipliğine dayalı sistemde, istemciler yalnızca girdilerini sunucuya gönderecek ve sunucudan geri gönderilen oyun sonuçlarını gösterecektir. Teknik olarak doğru olsa da, böyle bir sistem önemli bir girdi gecikmesine maruz kalacaktır çünkü her oyuncu eylemi sunucuya ulaşmak, işlenmek ve sonuç istemciye geri gönderilmek zorunda kalacaktır. Çoğu oyun için, özellikle hızlı tempolu olanlar için, bu gidiş‑dönüş gecikmesi oyunun gecikmeli, tepkisiz ve oynanamaz hissettirmesine neden olur.

Roblox'un sunucu yetkisi modelinde, gecikme, istemcilerin girdilerini sunucuya göndermenin yanı sıra etkilerini anında tahmin etmeleri ile telafi edilir. Örneğin, bir oyuncu bir düğmeye bastığında, istemci sunucunun yanıtını beklemez; bunun yerine son bilinen sunucu durumunun birkaç kare öncesini tahmin eder. Bu, istemcinin girdi eyleminin sonucunu anında göstermesine olanak tanır, böylece ağ gecikmesini etkili bir şekilde gizler ve oyunun tepki veren hissettirmesini sağlar.

Bazen istemci tahminini yanlış yapar (misprediction) ve ağ gecikmesi nedeniyle, istemci birkaç kare boyunca hata yaptığını bilmeyecektir. Örneğin:

Bir yanlış tahmin tespit edildiğinde, istemci tahminini sunucunun yetkili durumuna göre düzeltmelidir. Yetkili durum istemcinin tahmin ettiği durumdan farklıysa, istemci geri dönmeli ve yeniden simüle etmelidir. Bu istemci tarafı tahmin, geri dönüş ve yeniden simülasyon sistemi "gecikme telafisi" olarak bilinir ve sunucu yetkili çok oyunculu oyunların sorunsuz ve yanıt veren hissettirmesine yardımcı olur.

Kurulum

Sunucu yetkisi modeli, bazı diğer motor teknolojilerinin düzgün çalışmasını gerektirdiği için, öncelikle Explorer içindeki Workspace nesnesinde aşağıdaki özellikleri ayarlamalısınız:

  1. Workspace.UseFixedSimulation etkinleştirilmelidir
  2. Workspace.StreamingEnabled etkinleştirilmelidir
  3. Workspace.AuthorityMode Server olmalıdır (yukarıdakilerin hepsi önce ayarlanmalıdır)

Kavramlar

Sunucu yetkisi sistemi aşağıdaki bazı temel kavramlar üzerine kuruludur.

İstemci tahmini

İstemci tahmini aracılığıyla, istemci son bilinen sunucu durumunun birkaç kare öncesini simüle ederek oyuncu girdilerinin etkilerini hemen tahmin eder. Bu, girdi gecikmesini gizler, ancak tahmin daha sonra yanlış çıkabilir (client misprediction) ve bu nedenle düzeltme gerektirir. İstemci, girdilerinin sunucuya beklenen karede ulaşabilmesi için son bilinen yetkili sunucu durumunun önünde mümkün olduğunca ileri simüle etmeye çalışır. İstemcinin bildiği sunucu durumunun gerisindeki gecikmeye dayanarak tahmin edeceği kare sayısı belirlenir.

İstemci yanlış tahmini

İstemci sunucudan yetkili durumu aldığında, o durumu o kare için yerel olarak tahmin ettiği tarihsel bir kayıtla karşılaştırır. İstemcinin tahmin ettiği ile sunucunun gerçekte ne yaptığı arasında bir fark olduğunda, bu bir yanlış tahmin olur. Yanlış tahminler, ağ gecikmesindeki değişiklikler, diğer oyuncuların istemcinin beklemediği şekillerde hareket etmesi, oyunun belirli mantıkları yalnızca sunucuda çalıştırması vb. gibi çeşitli nedenlerden kaynaklanabilir.

Yetkili durum istemcinin tahmin ettiği durumdan farklıysa, istemci geri dönmeli ve yeniden simüle etmelidir.

Geri dönme ve yeniden simülasyon

Bir istemci yanlış tahmini tespit ettiğinde, sunucunun yetkili durumuna geri dönmeli ve ardından tahmin edilen kareye geri dönmek için yeniden simüle etmelidir. Ağ gecikmesine bağlı olarak, istemci son bilinen yetkili sunucu durumunun önünde sadece yeterince ileri simüle etmeye çalışır, böylece girdileri sunucuya beklenen karede ulaşır.

Yukarıdaki diyagramda, istemci sunucunun 2 kare öncesini simüle ediyor. 3. kare için girdilerini gönderiyor ve bu girdiler sunucuda beklenen karede (3) ulaşıyor. Sunucu, 3. kare için yetkili durumu gönderiyor ve istemci bunu 7. karede alıyor. İstemci, 3. kareyi yanlış tahmin ettiğini fark ederek sunucunun 3. karesine geri dönüyor ve 4, 5 ve 6. kareleri yeniden simüle ediyor ve ardından 7. kareyi simüle ediyor. Oyuncular, aniden gerçekleşen bir hareket gibi belirgin bir ağ hatası görebilirler.

Özetle, istemci:

  1. Sunucudan gelen yetkili durumu alır ve bunu kendi tahmin edilen durumu ile karşılaştırır.
  2. Eğer istemcinin tahmini yanlışsa:
    1. İstemci sunucudan aldığı son bilinen yetkili duruma geri döner.
    2. İstemci yetkili durumdan tahmin edilen durumuna kadar yeniden simüle eder ve herhangi bir yerel girdi yeniden uygulanır.

Uygulama

Ağ sahipliği ve tahmini

Sunucu yetkisi modelinde, temel oyun nesnelerini sunucuya ait tutarak sunucu sahipliğiyle ilişkili olan girdi gecikmesi maliyetini üstlenebilirsiniz. Araçlar, oyuncu karakterleri veya diğer oyun açısından kritik nesneler, diğer oyuncularla etkileşime girerken bile sunucuya ait kalabilir.

Varsayılan olarak, Roblox yerel oyuncunun Character nesnesi yakınındaki özellikleri otomatik olarak tahmin eder, ancak daha ayrıntılı bir kontrol istiyorsanız bir nesnenin tahminini açıkça açıp kapatmak için RunService:SetPredictionMode() işlevini kullanabilirsiniz.

Simülasyon senkronizasyonu

Sunucu yetkisi modelinde, istemci ve sunucunun her ikisi de temel simülasyonu çalıştırmak zorundadır ve istemcinin simülasyonunun bir yanlış tahmin gerçekleştiğinde geri dönmesi ve yeniden simüle etmesi gerekir. Bunu etkinleştirmek için, temel mantığınızı hem istemci hem de sunucuda başlatılan bir ModuleScript içinde RunService:BindToSimulation() üzerinden bağlanmış işlevler içinde yazın.

Sunucu yetkisi kurulum

Yeniden simüle ederken, Roblox, BindToSimulation() aracılığıyla simülasyona bağlı olan işlevleri yeniden çalıştıracaktır. Oyuncu girdilerini işlemek, senkronize edilmiş fizik nesneleriyle etkileşime girmek ve temel oyun durumunu güncellemek bu bağlı işlevlerin içinde gerçekleşmelidir.

ModuleScript adlı Simulation nesnesi ReplicatedStorage içinde:

Simülasyon

local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local Simulation = {}
Simulation.Initialize = function()
RunService:BindToSimulation(function(deltaTime)
-- Oyuncu girdilerini oku
-- Oyun durumunu güncelle
end)
end
return Simulation

Durum senkronizasyonu ile özellikler

Roblox, tahmin edilen nesnelerdeki simülasyon erişimi ile tüm özellikleri otomatik olarak senkronize eder. Özel veriler için, özellikler, tahmin edilmiş olarak işaretlenmiş nesneleri senkronize etmenin birincil yoludur; bu tür nesnelerde, sunucunun doğruluk kaynağı ile istemcinin tahmini arasındaki herhangi bir özellik değeri uyumsuzluğu, tam bir geri dönüş ve yeniden simülasyon tetikler.

Özellik kısıtlamaları

Bir özelliğin çoğaltılması için, tüm aşağıdaki kriterleri karşılaması gerekir:

  • Bu, Instance üzerinde ilk 64 özellik arasındadır.
  • Adı en fazla 50 karakter içerir.
  • Eğer bir string türü özelliği ise, değeri en fazla 50 karakter içerir.

Simülasyon erişimi

Motor API referansındaki birçok özellik ve yöntem, Simülasyon Erişimi etiketi ile birlikte gelir; örneğin BasePart.CFrame. Bu etiketle işaretlenmiş özellikler, sunucu yetkisi sistemi tarafından tahmin edilecektir. Ayrıca, yalnızca bu etiketle işaretlenmiş özellikler ve yöntemler, RunService:BindToSimulation() ile bağlı işlevler içinde kullanılabilir.

Girdi eylemleri

Sunucu yetkisine sahip bir oyun içinde, bir istemcinin oyunun durumunu etkilemenin birincil yolu, Girdi Eylem Sistemi aracılığıyla gerçekleşir. Bu girdiler sunucuya gönderilir ve yeniden simülasyon sırasında istemci üzerinde tekrar oynatılır. Sonuç olarak, InputActions, temel simülasyonu etkileyen tüm girdiler için kullanılmalı ve işlenmeden önce sağlamlıkları kontrol edilmelidir.

InputContexts bir Player alt nesnesi olmalıdır, böylece motor InputContext üzerindeki sahipliği kimlerin sahip olduğunu bilebilir. Bir yaklaşım, InputContexts nesnelerinizi ReplicatedStorage altında bir klasöre eklemek ve her oyuncu için ServerScriptService altında bir Script kullanarak InputContexts kopyalamaktır:

InputSetup

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)
end

Bu desenle, RunService:BindToSimulation() içinde hem istemci hem de sunucuda tüm oyuncular için InputActions okuyabilir ve belirli bir kare için aynı verileri alabilir, ayrıca önceki kare girdisini bir özellikte kaydedebilir, örneğin RunAction girdi eylemi tetiklendiğinde bir karakterin koşmasını sağlamak için.

Özelleştirilmiş verileri Girdi Eylem Sistemi içerisine yazmanız gerektiğinde, RunService.RenderStepped veya RunService:BindToRenderStep() ile bağlı bir işlev kullanmalısınız, RunService:BindToSimulation() değil. RunService:BindToSimulation() içinde bir InputAction ateşlemek, istemcilerin yeniden simülasyonda yanlış sonuçlar üretmesine neden olabilir.


local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
RunService:BindToRenderStep("CameraInput", Enum.RenderPriority.Last.Value, function()
-- İstemcinin kameranın ileri vektörünü sunucuya bir InputAction aracılığıyla gönderin
local cameraForwardInputAction = Players.LocalPlayer.PlayContext.CameraForward
local cameraForwardVector = Workspace.CurrentCamera.CFrame.LookVector
cameraForwardInputAction:Fire(cameraForwardVector)
end)

Uzak olaylar

Uzak olaylar, istemci ve sunucu arasında belirli iletişimi kolaylaştırmak için sunucu yetkisi modeli içinde kullanılmaya devam edilebilir. Örneğin, sunucular, oyuncuların puan kazanması veya nesneleri toplaması hakkında veri yaymak için uzak olayları kullanabilir ve istemciler, uzak olayları sunucuya giriş göndermek için alternatif bir API olarak kullanabilirler, örneğin düğmelere basma veya 3D dünyadaki nesnelere dokunma amaçlı.

Animasyonlar, sesler ve efektler

İstemci tarafı efektler, animasyonlar ve sesler, istemci simülasyonunun yalnızca yetkili sunucu durumunun bir tahmini olduğunu bilerek yazılmalıdır. BindToSimulation() bağlı işlevler içinde hangi özelliklerin ve yöntemlerin çağrılabileceğini sınırlamaktadır, bu da sizi yalnızca senkronize edilmiş simülasyon durumuna yazmaya yönlendirir. Bu simülasyonun sonuçlarını görüntülemek, efektleri ve sesleri tetiklemek vb. ayrı bir işlevde gerçekleştirilmelidir; bu işlev, simülasyonun sonuçlarını okuyarak istenen efektleri tetikler.

Tahmin edilen bir simülasyonun nasıl görüntüleneceği hakkında daha fazla bilgi, ileri teknikler kılavuzunda yer almaktadır.

Örnek projeler

Bu belgelerin yanı sıra, aşağıdaki şablonlar size başlamanızda yardımcı olabilir:

Yarış
Futbol
Lazer Tag
©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.