Sunucu yetki 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 yetki modelinde, sunucu tüm oyun durumu için tek doğru kaynak olup, istemciler yalnızca kendi girdilerini rapor etmek için güvenilir kabul edilir. Bu mimari, hileci istemcilerin kendi konumlarını veya durumlarını bildirmesine asla inanmadığı için, hileye karşı adil, rekabetçi bir oyun için temel net kodu temeli olup, uçucu hileler (flyhacks) veya hız hileleri (speedhacks) gibi hile türlerini engeller.

Avantajlar

Naif bir sunucu sahipli sistemde, istemciler yalnızca girdilerini sunucuya gönderir ve sunucudan geri dönen oyun sonuçlarını görüntüler. Teknik olarak doğru olsa da, böyle bir sistem, her oyuncu eyleminin sunucuya ulaşması, işlenmesi ve sonuç olarak istemciye geri gönderilmesi gerektiği için önemli girdi gecikmesi ile karşılaşır. Çoğu oyun için, özellikle hızlı tempolu olanlarda, bu gidiş-dönüş gecikmesi oyunun hissedilmesini yavaş, tepkisiz ve oynanamaz hale getirir.

Roblox'un sunucu yetki modelinde, gecikme, istemcilerin girdilerinin etkilerini anında tahmin etmesiyle telafi edilir ve bunları sunucuya gönderirken kullanılır. Örneğin, bir oyuncu bir tuşa bastığında istemci, sunucunun yanıt vermesini beklemez; bunun yerine, son bilinen sunucu durumu öncesinde birkaç kare tahmin eder. Bu, istemcinin girdi eyleminin sonucunu anında göstermesine olanak tanır, böylece ağ gecikmesini etkili bir şekilde saklar ve oyunun duyarlı hissettirmesini sağlar.

Bazen istemci tahmininde yanılabilir (misprediction) ve ağ gecikmesi nedeniyle, istemci yanlış yaptığını birkaç kare boyunca bilemez. Örneğin:

Bir yanlış tahmin tespit edildiğinde, istemci, sunucunun yetkili durumu temelinde tahminini düzeltmelidir. Yetkili durum, istemcinin tahmin edilen durumundan farklıysa, istemci geri almal ve yeniden simüle etmelidir. Bu istemci tarafı tahmin, geri alma ve yeniden simülasyon sistemi "gecikme telafisi" olarak bilinir ve sunucu yetkili çok oyunculu oyunların pürüzsüz ve duyarlı hissettirmesine yardımcı olur.

Kurulum

Sunucu yetki modeli, doğru çalışması için belirli diğer motor teknolojilerine ihtiyaç duyar. Workspace nesnesindeki Explorer üzerinde aşağıdaki özellik ayarlarını doğrulayın:

  1. Workspace.AuthorityMode Server olmalıdır (bu ayar otomatik olarak aşağıdaki beşini ayarlayacaktır).
  2. Workspace.UseFixedSimulation etkin olmalıdır.
  3. Workspace.StreamingEnabled etkin olmalıdır.

Kavramlar

Sunucu yetki sistemi aşağıdaki birkaç temel kavram üzerine çalışır.

İstemci tahmini

İstemci tahmini aracılığıyla, istemci, oyuncu girdilerinin etkilerini hemen tahmin etmek için son bilinen sunucu durumunun birkaç kare öncesini simüle eder. Bu, girdi gecikmesini gizler, ancak tahmin sonradan yanlış çıkabilir (istemci yanlış tahmini) ve bu nedenle düzeltme gerektirebilir. İstemci, girdilerinin sunucuya istenen karede ulaşabilmesi için son bilinen yetkili sunucu durumunun ne kadar ileriye simüle edeceğini ayarlamaya çalışır. İstemcinin bilinen sunucu durumunun önünde ne kadar kare tahmin edeceği, istemci ve sunucu arasındaki gecikliğe bağlıdır.

İstemci yanlış tahmini

İstemci, sunucudan yetkili durumu aldığında, bu durumu o kare için yerel olarak tahmin ettiği tarihsel bir kayıtla karşılaştırır. İstemci tahmin etti ve sunucunun gerçekten yaptığı arasında bir fark olduğunda, bu bir yanlış tahmindir. 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 birkaç nedenle meydana gelebilir.

Yetkili durum, istemcinin tahmin edilen durumundan farklıysa, istemci geri almal ve yeniden simüle etmelidir.

Geri alma ve yeniden simülasyon

Bir istemci yanlış tahmin algıladığında, sunucunun yetkili durumuna sıfırlamalı ve ardından tahmin edilen kareye geri dönmek için yeniden simüle etmelidir. Ağ gecikmesine dayanarak, istemci son bilinen yetkili sunucu durumunun ne kadar ileriye simüle edeceğini ayarlamaya çalışır, böylece girdileri sunucuya istenen karede ulaşır.

Yukarıdaki diyagramda, istemci sunucunun 2 kare öncesini simüle etmektedir. Girdi gönderimi için 3. karede sunucuya gönderilir ve hedef karede (3) ulaşır. Sunucu, 3. kare için yetkili durumu gönderir ve istemci bunu 7. karede alır. İstemci, 3. kareyi yanlış tahmin ettiğini keşfeder, bu nedenle sunucunun 3. karesine geri döner ve 4, 5 ve 6. kareleri yeniden simüle eder, ardından 7. kareyi simüle eder. Oyuncular ani bir hareket gibi belirgin bir ağ artefaktı görebilir.

Özetle, istemci:

  1. Sunucudan 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 alınan son bilinen yetkili duruma geri döner.
    2. İstemci, yetkili durumdan tahmin edilen durumuna yeniden simüle eder, herhangi bir yerel girdi yeniden uygulanır.

Uygulama

Ağ sahipliği ve tahmin

Sunucu yetki modelinde, ana oyun nesnelerini sunucu sahipliğinde tutabilir, sunucu sahipliği ile genellikle ilişkili olan girdi gecikmesi maliyetine katlanmadan. Arabalar, oyuncu karakterleri veya diğer oyun kritik nesneler, diğer oyuncularla etkileşimde bulunsa bile, sunucu sahipliğinde kalabilir.

Varsayılan olarak, Roblox, yerel oyuncuya yakın simülasyon erişimine sahip özellikleri otomatik olarak tahmin eder, ancak daha ince bir kontrol istiyorsanız, bir örneğin tahminini RunService:SetPredictionMode() ile açıkça zorlayabilirsiniz.

Simülasyon senkronizasyonu

Sunucu yetki modelinde, istemci ve sunucu her ikisi de temel simülasyonu yürütmelidir ve istemcinin simülasyonunun, bir yanlış tahmin meydana geldiğinde geri alıp yeniden simüle edebilmesi gerekir. Bunu sağlamak için, temel mantığınızı, hem istemci hem de sunucuda başlatılan ModuleScript içinde RunService:BindToSimulation() üzerinden bağlı fonksiyonlar içinde yazın.

Sunucu yetki kurulumu

Yeniden simülasyon sırasında, Roblox, BindToSimulation() aracılığıyla simülasyona bağlı fonksiyonları yeniden çalıştıracaktır. Oyuncu girdilerini işlemek, senkronize fizik nesneleri ile etkileşimde bulunmak ve temel oyun durumunu güncellemek bu bağlı fonksiyonlar içinde yer almalıdır.

ModuleScript adı Simulation ve 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 nitelikler

Roblox, tahmin edilen nesnelerdeki tüm simülasyon erişimine sahip özellikleri otomatik olarak senkronize eder. Özel veriler için, nitelikler tahmin edilen olarak işaretlenmiş nesnelerin senkronizasyonu için birincil yoldur; bu tür nesnelerde, sunucunun doğru kaynak ile istemcinin tahminleri arasındaki herhangi bir nitelik değeri uyumsuzluğu, tam geri alma ve yeniden simülasyon tetikler.

Nitelik sınırlamaları

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

  • Instance içindeki ilk 64 nitelikten biri olmalıdır.
  • Adı en fazla 50 karakter içermelidir.
  • Eğer bir dize türü niteliği ise, değeri en fazla 50 karakter içermelidir.

Simülasyon erişimi

Motor API referansında birçok özellik ve metodun yanında Simülasyon Erişimi etiketini içerir; örneğin BasePart.CFrame. Bu etiketle etiketlenmiş özellikler, sunucu yetki sistemi tarafından tahmin edilecektir. Ayrıca, yalnızca bu etiketle etiketlenen özellikler ve metodlar, RunService:BindToSimulation() ile bağlı fonksiyonlar içinde erişilebilir.

Girdi eylemleri

Sunucu yetkili bir oyunda, bir istemcinin oyun durumunu etkilemesinin birincil yolu Girdi Eylem Sistemi üzerinden yapılır. Bu girdiler sunucuya gönderilir ve yeniden simülasyon sırasında istemcide yeniden oynatılır. Bu nedenle, InputActions temel simülasyonu etkileyen tüm girdiler için kullanılmalı ve işlenmeden önce sağlamlıkları kontrol edilmelidir.

InputContexts bir Player’ın alt öğesi olmalıdır, böylece motor InputContext üzerinde kimin sahip olduğunu bilebilir. Bir yaklaşım, InputContexts öğelerinizi ReplicatedStorage altında bir klasöre eklemek ve her bir oyuncu için ServerScriptService altında bir Script kullanarak InputContexts'yi klonlamaktı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 modeli kullanarak, hem istemcide hem de sunucuda RunService:BindToSimulation() içinde tüm oyuncular için InputActions'ı okuyabilir ve belirli bir kare için aynı veriyi alabilir ve önceki karenin girdisini nitelik içinde kaydedebilirsiniz; örneğin bir RunAction girdi eylemi tetiklendiğinde bir karakterin koşmasını sağlamak için.

Uzaktan olaylar

Uzaktan olaylar hâlâ sunucu yetki modelinde istemci ve sunucu arasında ayrık iletişimi kolaylaştırmak için kullanılabilir. Örneğin, sunucular uzaktan olaylar kullanarak oyuncuların puan kazanması veya nesneleri toplaması hakkında veri yayabilir ve istemciler, sunucuya gönderilen girdiler için alternatif bir API olarak uzaktan olaylar kullanabilir, örneğin buton basışları veya 3D dünyada nesnelere dokunma gibi.

Animasyonlar, sesler ve efektler

İstemci tarafındaki efektler, animasyonlar ve sesler, istemci simülasyonunun yalnızca yetkili sunucu durumunun bir tahmini olduğunu bilerek yazılmalıdır. BindToSimulation() ile bağlı fonksiyonlar içinde çağrılabilecek özellikler ve metodlar üzerindeki sınırlamalar, yalnızca senkronize simülasyon durumuna yazmak için doğru bir yol izlenmesine yardımcı olur. Bu simülasyonun sonuçlarını görüntülemek, efektleri ve sesleri tetiklemek vb., simülasyonun sonuçlarını okumak ve istenen efektleri tetiklemek için RenderStepped ile bağlantılı ayrı bir fonksiyonda yapılmalıdır.

Tahmin edilen bir simülasyonun görüntülenmesi hakkında daha fazla bilgi, gelişmiş teknikler kılavuzunda bulunmaktadır.

Örnek projeler

Bu belgelerin yanı sıra, aşağıdaki şablonlar size başlangıçta 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.