Dunia terbuka yang luas di Roblox sering kali mengalami lag parah di perangkat seluler akibat beban geometri dan panggilan gambar (Draw Call) yang berlebihan.
Dengan menerapkan sistem LOD bertingkat menggunakan `RenderFidelity.Performance`, penyesuaian jarak di Luau, dan impostor 2D, game dapat berjalan lancar di 60 FPS pada semua perangkat.
1. Hambatan GPU: Draw Call dan Jumlah Poligon
Batasan perangkat keras pada mesin rendering Roblox:
- Beban Draw Call: Lebih dari 1.500 panggilan per frame membebani CPU perangkat seluler.
- Pemborosan Vertex: Objek jauh dengan ribuan poligon membuang daya pemrosesan grafis.
- Pergantian tekstur berulang: Memperlambat jalannya aliran kerja GPU.
- Thermal throttling: Panas berlebih memaksa prosesor ponsel menurunkan performanya.
2. RenderFidelity dan Sistem LOD Bawaan Roblox
Memanfaatkan penyederhanaan geometri otomatis:
- `RenderFidelity.Precise`: Mempertahankan 100% detail; gunakan hanya untuk benda jarak dekat.
- `RenderFidelity.Performance`: Menghasilkan 4 tingkat geometri otomatis berdasarkan ukuran di layar.
- `CollisionFidelity.Box`: Menyederhanakan tabrakan dekorasi agar CPU tidak terbebani.
- Instancing otomatis: Mesh identik dengan material sama dirender bersamaan dalam 1 panggilan.
--!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. Impostor 2D dan Caching Tekstur
Mengganti model 3D kejauhan dengan gambar datar 2D:
- Konsep impostor: Di atas 300 stud, gedung atau pohon diganti gambar datar tanpa terlihat berbeda.
- Penghematan poligon: Hutan lebat dapat diringkas dari jutaan poligon menjadi ratusan saja.
- Penggabungan tekstur: Banyak impostor dalam satu lembar gambar memangkas draw call drastis.
- Transisi dither: Mencegah perubahan objek terlihat kasar atau mendadak.
4. StreamingEnabled dan Manajemen Memori
Memuat dunia besar ke dalam memori ponsel:
- StreamingMinRadius kecil untuk mencegah crash saat spawn.
- `ModelStreamingMode.Atomic`: Memuat kendaraan sebagai satu kesatuan utuh.
- `ModelStreamingMode.Persistent`: Menjaga bangunan penting tetap ada di memori.
- Menanggapi peringatan RAM rendah dengan memangkas jarak pandang secara dinamis.
5. Checklist Produksi Seluler
Langkah praktis peluncuran game mulus:
- Menggabungkan tekstur objek kecil ke atlas 1024x1024.
- Mematikan CastShadow pada rumput dan batu kecil.
- Menjaga waktu render di bawah 16,6 ms pada MicroProfiler.
- Uji coba berkala di profil ponsel spesifikasi rendah.
Frequently Asked Questions
Apa bedanya RenderFidelity dengan LOD kustom?
RenderFidelity hanya mengurangi poligon mesh, sedangkan LOD kustom bisa menukar model dengan gambar 2D datar.
Apakah mematikan tabrakan mempercepat rendering?
Ya, karena mempercepat kalkulasi persiapan grafis di dalam mesin game.
Berapa batas aman Draw Call untuk perangkat seluler?
Sekitar 400 hingga 800 panggilan agar ponsel tidak panas dan patah-patah.