Rekabetçi Roblox oyunlarında akıcılık ağ yanıt süresine bağlıdır. Her mermi veya adım için ayrı RemoteEvent tetiklemek veri arabelleğini hızla tüketir ve mobil bağlantılarda gecikmelere sebep olur.
Modern Luau `buffer` kütüphanesi ve `UnreliableRemoteEvent` sınıfı ile geliştiriciler ağ replikasyonunu bayt düzeyinde kontrol edebilir. İkili serileştirme ve paketleme sayesinde 100 oyunculu sunucular minimum bant genişliğiyle çalışır.
1. Replikasyon Bütçesi ve Paket Sınırları
Roblox ağ motorunun fiziksel ve mimari sınırları:
- 50 KB/s Kuralı: İstemci başına 50 KB/s'yi aşmak yapay gecikmelere ve paket birikmelerine yol açar.
- RemoteEvent Başlık Yükü: Her çağrı yaklaşık 9 bayt başlık verisi ekler. 60 FPS'de yalnızca başlıklar saniyede 500 bayt harcar.
- Sunucu Koruması: Aşırı paket gönderen istemcilerin paketleri sunucu tarafından otomatik olarak düşürülür.
2. RemoteEvent vs. UnreliableRemoteEvent
Veri tipine göre doğru protokolü seçme:
- RemoteEvent (Güvenilir, TCP benzeri): Sıralı ve kesin teslimat sağlar. Satın alımlar, hasar ve tur geçişleri için zorunludur.
- UnreliableRemoteEvent (Hızlı, UDP benzeri): Geciken paketleri tekrar göndermeden atar. Mermi izleri, sesler ve telemetri için idealdir.
- Tıkanmayı Önleme: Anlık WiFi dalgalanmalarında tekrar deneme kuyruğu oluşturmaz.
3. Luau Buffer ile İkili Serileştirme
Büyük tabloları kompakt ikili bayt dizilerine dönüştürme:
- Tablo İsrafı:
{ x = 120.5, y = 14.2, z = -80.1, id = 42 }anahtar isimleri yüzünden 40 bayttan fazla yer tutar. - 7 Baytlık Buffer:
buffer.create(7)ile üç adet 16-bit sayı ve 1 bayt tam sayı ile veriyi %82 oranında küçültebilirsiniz. - Bit Maskeleme: Koşma, eğilme ve nişan alma gibi boolean değerleri tek bir bayta paketleyin.
-- Giriş verisi serileştirme modülü
local PacketCompressor = {}
function PacketCompressor.serialize(posX, posY, posZ, flags)
local buf = buffer.create(7)
buffer.writei16(buf, 0, math.clamp(math.round(posX * 10), -32768, 32767))
buffer.writei16(buf, 2, math.clamp(math.round(posY * 10), -32768, 32767))
buffer.writei16(buf, 4, math.clamp(math.round(posZ * 10), -32768, 32767))
local mask = 0
if flags.isSprinting then mask = bit32.bor(mask, 1) end
if flags.isCrouching then mask = bit32.bor(mask, 2) end
if flags.isAiming then mask = bit32.bor(mask, 4) end
if flags.isGrounded then mask = bit32.bor(mask, 8) end
buffer.writeu8(buf, 6, mask)
return buf
end
function PacketCompressor.deserialize(buf)
local posX = buffer.readi16(buf, 0) / 10
local posY = buffer.readi16(buf, 2) / 10
local posZ = buffer.readi16(buf, 4) / 10
local mask = buffer.readu8(buf, 6)
local flags = {
isSprinting = bit32.band(mask, 1) ~= 0,
isCrouching = bit32.band(mask, 2) ~= 0,
isAiming = bit32.band(mask, 4) ~= 0,
isGrounded = bit32.band(mask, 8) ~= 0,
}
return posX, posY, posZ, flags
end
return PacketCompressor
4. Paket Paketleme ve Frekans Sınırlama
Mikro olayları sabit zaman aralıklarında topluca gönderme:
- 20 Hz Sabit Gönderim: RenderStepped içinde doğrudan çağrı yapmayın. Verileri toplayıp 50 ms aralıklarla gönderin.
- Toplu Gönderim: Aynı karede gerçekleşen birden fazla eylemi tek bir buffer içinde birleştirin.
- Delta Sıkıştırma: Mutlak koordinatlar yerine yalnızca önceki duruma göre değişen farkı iletin.
5. Sunucu Doğrulaması, İstemci Tahmini ve Gecikme Telafisi
Hileleri önleyen ve tepkiselliği koruyan mimari:
- İstemci Tahmini: Hareket ve görsel tepkiler sunucu onayını beklemeden yerel olarak anında gösterilir.
- Yetkili Doğrulama: Sunucu hareket hızını, ateş sıklığını ve görüş hatlarını bağımsız olarak denetler.
- Gecikme Telafisi (Lag Compensation): Sunucu son 1000 ms boyunca oyuncu konumlarını saklar ve vuruş anında zamanı geri sararak kontrol eder.
Frequently Asked Questions
RemoteEvent ile UnreliableRemoteEvent arasındaki fark nedir?
RemoteEvent güvenilir teslimat sağlar ve kayıp paketleri tekrar yollar. UnreliableRemoteEvent ise UDP gibi çalışır, geciken paketleri atarak bant genişliğini korur.
Luau Buffer gecikmeyi nasıl azaltır?
Gereksiz tablo anahtarlarını ortadan kaldırır ve veriyi saf ikili bayt olarak ileterek boyutunu %80'den fazla küçültür.
Neden RenderStepped içinde RemoteEvent çağrılmamalıdır?
RenderStepped ekran yenileme hızında çalışır (144Hz+). Her karede veri göndermek 50 KB/s limitini aşarak gecikmeye neden olur.
Sunucu gecikme telafisi (Lag Compensation) nedir?
Sunucunun geçmiş oyuncu konumlarını kaydedip, ateş anında zamanı atıcının pingine göre geri sararak vuruşları doğru değerlendirmesidir.