Roblox'ta devasa açık dünyalar inşa etmek, mobil cihazlarda aşırı poligon ve çizim çağrısı (Draw Call) nedeniyle ağır takılmalara yol açabilir.
`RenderFidelity.Performance`, Luau mesafe yöneticisi ve 2B billboard impostorlarını birleştiren akıllı bir LOD hattı ile tüm cihazlarda 60 FPS elde edebilirsiniz.
1. GPU Darboğazı: Çizim Çağrıları ve Poligon Yükü
Roblox render motorunun mobil sınırlamaları:
- Çizim çağrısı yükü: Kare başına 1.500'ü aşan çağrılar mobil işlemcileri kilitler.
- Gereksiz tepe noktaları: Uzaktaki küçük nesnelerde binlerce poligon hesaplamak GPU gücünü tüketir.
- Sık kaplama değişimi: Doku atlası kullanılmaması grafik akışını duraklatır.
- Termal kısma: Aşırı ısınma cihazın hızını 5 dakika içinde zorla düşürür.
2. RenderFidelity ve Yerleşik Roblox LOD Sistemi
Otomatik geometri sadeleştirmesinin etkin kullanımı:
- `RenderFidelity.Precise`: Tam geometriyi korur; yalnızca birinci şahıs nesnelerinde kullanılmalıdır.
- `RenderFidelity.Performance`: Mesafeye göre otomatik olarak 4 sadeleştirme seviyesi sunar.
- `CollisionFidelity.Box`: Arka plan nesnelerinde basit çarpışma kutuları kullanarak fizik yükünü azaltın.
- Otomatik örnekleme (Instancing): Aynı malzemeye sahip eş nesneler tek bir çağrıda çizilir.
--!strict
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local LODManager = {}
type LODModel = { HighDetail: Model, LowDetail: Model, Impostor: BillboardGui, Position: Vector3, CurrentTier: number }
local registeredLODs: {LODModel} = {}
function LODManager.Register(high: Model, low: Model, impostor: BillboardGui, centerPos: Vector3)
table.insert(registeredLODs, { HighDetail = high, LowDetail = low, Impostor = impostor, Position = centerPos, CurrentTier = 1 })
low.Parent = nil
impostor.Enabled = false
end
local frameCounter = 0
RunService.Heartbeat:Connect(function()
frameCounter += 1
if frameCounter % 6 ~= 0 then return end
local camera = Workspace.CurrentCamera
if not camera then return end
local camPos = camera.CFrame.Position
for _, lod in ipairs(registeredLODs) do
local offset = lod.Position - camPos
local distSq = offset.X * offset.X + offset.Y * offset.Y + offset.Z * offset.Z
local newTier = distSq > 640000 and 4 or (distSq > 122500 and 3 or (distSq > 14400 and 2 or 1))
if newTier ~= lod.CurrentTier then
lod.CurrentTier = newTier
lod.HighDetail.Parent = (newTier == 1) and Workspace or nil
lod.LowDetail.Parent = (newTier == 2) and Workspace or nil
lod.Impostor.Enabled = (newTier == 3)
end
end
end)
return LODManager
3. 2D Billboard Impostorları ve Doku Önbellekleme
Uzak 3B modelleri düz 2B görsellerle değiştirme:
- Impostor mantığı: 300 stud ötedeki binalar tek bir düz kaplama ile fark edilmeden temsil edilir.
- Milyonlarca poligon tasarrufu: Uzak ormanlar birkaç yüz noktaya indirgenir.
- Atlas paylaşımı: Çok sayıda impostorun tek bir dokuda toplanması çizim çağrılarını düşürür.
- Dither geçişi: Nesnelerin aniden belirip kaybolmasını önleyen yumuşak geçiş.
4. StreamingEnabled ve Bellek Mimarisi
Büyük dünyaları telefon hafızasına güvenle yükleme:
- Kompakt StreamingMinRadius ile ilk doğuş anındaki çökmeleri engelleme.
- `ModelStreamingMode.Atomic`: Araçların tek bir parça halinde yüklenmesini sağlama.
- `ModelStreamingMode.Persistent`: Önemli simgesel yapıları bellekte sürekli tutma.
- Düşük bellek uyarılarında görüş mesafesini otomatik kısma.
5. Mobil Optimizasyon Kontrol Listesi
Sorunsuz mobil deneyim için altın kurallar:
- Küçük nesne dokularını 1024x1024 atlaslarda birleştirin.
- Çim ve taş gibi küçük nesnelerde CastShadow özelliğini kapatın.
- MicroProfiler'da kare süresinin 16.6 ms altında olduğunu doğrulayın.
- Giriş seviyesi telefon profillerinde test yapın.
Frequently Asked Questions
RenderFidelity ile özel LOD scripti arasındaki fark nedir?
RenderFidelity sadece poligon azaltır; kod tabanlı LOD ise nesneyi 2D görsele dönüştürebilir veya tamamen gizleyebilir.
Çarpışmaları kapatmak render hızını etkiler mi?
Evet, motorun çizim öncesi mekansal hazırlık hesaplarını rahatlatır.
Mobil için güvenli Draw Call sayısı kaçtır?
400 ile 800 çağrı arası idealdir; 1.200 üzeri aşırı ısınma yaratır.