Sahne Optimizasyonu: Culling ve LOD Sistemleri Pratik Uygulaması
Oyun sahnesinde binlerce nesne varsa, hepsi aynı anda çizilirse GPU ve CPU yorulur. Culling ve LOD sistemleri bu sorunu çözer: görünmeyen nesneleri atlar, uzaktaki detayları azaltır.
Culling, kameranın göremediği nesneleri render işleminden çıkarmaktır. LOD (Level of Detail) ise uzaklığa göre model karmaşıklığını azaltır. Mesela 100 metre uzakta bir ağacın yaprakları detaylı çizilmez; sadece gövde ve genel şekli görünür.
Unity'de bu işi kameraya yakın bir volume ile yaparız. Frustum culling Unity'nin varsayılan olarak yaptığı işlem, ama manuel kontrol için Physics.OverlapSphere kullanabiliriz.
Bu kod, kamera etrafında 50 metre yarıçaplı bir küre içindeki nesneleri etkinleştirir, dışındakileri devre dışı bırakır:
1using UnityEngine;23public class CullingManager: MonoBehaviour {4public Camera mainCamera;5public float cullingRadius = 50f;6public GameObject[] sceneObjects;78void Update() {9Vector3 cameraPos = mainCamera.transform.position;1011foreach (GameObject obj in sceneObjects) {12float distance = Vector3.Distance(obj.transform.position, cameraPos);13bool shouldRender = distance < cullingRadius;14obj.SetActive(shouldRender);15}16}17}LOD sistemi için, her nesneye birden fazla model versiyonu ekleriz. Yakında detaylı, uzakta basit model gösterilir:
1using UnityEngine;23public class LODSystem: MonoBehaviour {4public GameObject highDetail; // Yakın mesafe5public GameObject lowDetail; // Uzak mesafe6public float lodDistance = 30f;7private Camera mainCamera;89void Start() {10mainCamera = Camera.main;11}1213void Update() {14float distance = Vector3.Distance(transform.position, mainCamera.transform.position);1516if (distance < lodDistance) {17highDetail.SetActive(true);18lowDetail.SetActive(false);19} else {20highDetail.SetActive(false);21lowDetail.SetActive(true);22}23}24}Bu kod çalıştırıldığında kamera 30 metreden yakınsa detaylı model, uzaksa basit model aktif olur. FPS ölçerken farkı göreceksin, culling ve LOD aktifken 2-3 kat daha hızlı çalışabilir.
Gerçek projede Unity'nin yerleşik LOD Group bileşenini de kullanabilirsin; daha optimize ve kontrollüdür. Ama bu mantık anlaşıldıktan sonra karmaşık sistemler kurmak kolay hale gelir.
0 yorum