Three.js · Etkileşim · Raycaster
Continuous vs. Single Raycast: frekansın gücü ve bedeli
Raycaster’ın ne kadar “zeki” veya “hızlı” olduğu kadar, ne sıklıkla çalıştığı da hayati önem taşır. Bu ayrım, uygulamanın kullanıcıyla kurduğu etkileşimin ritmini belirler.
Bir tarafta olay anında tek seferlik tarama (single), diğer tarafta her karede yenilenen izleme (continuous). İkisi de aynı geometriyi kullanabilir; fark, CPU yükü ile tepkisellik arasındaki sözleşmededir.
Önce Mesh picking ve Intersection test akışını hatırlamak faydalıdır; burada odak ne zaman ve ne sıklıkla ray attığındadır.
A) Single Raycast (tetikleyici bazlı ışın)
Single Raycast, sadece belirli bir olay (event) gerçekleştiğinde, bir defaya mahsus çalışan ışındır.
Bu model, etkileşimi olay kuyruğuna bağlar: tarayıcı veya oyun motoru bir girdi bildirdiğinde bir kez “soru sorarsın”, cevabı işlersin. Kare hızı (FPS) ile yarışmazsın; bu yüzden pil ve CPU açısından en sakin yoldur.
Çalışma mantığı
Kullanıcı fareye tıkladığında (mousedown), bir tuşa bastığında veya bir menüyü açtığında tetiklenir. Işın o anda hesaplanır, sonuç işlenir ve akış devam eder.
Dokunmatikte karşılığı genelde touchstart / touchend eşlemesidir; pointer API ile tek akışta birleştirmek yaygındır. Önemli ayrıntı: aynı fiziksel tıklama için mousedown + mouseup çift tetik istemiyorsan, “hangi fazda ray atılacağını” (ör. sadece click birleşimi) netleştirmen gerekir.
Hesaplama yükü
Çok düşük. Sadece ihtiyaç anında kısa süreliğine çalışır ve durur; sürekli döngüde tekrarlanmaz.
Yine de “tek sefer” olduğu her şey ucuz değildir: Işın başına düşen kesişim testi ağır olabilir. Single, frekansı düşürür; pahalı olan narrow-phase ise yine sahne tasarımına bağlıdır.
Kullanım alanları
- Nesne seçimi (selection): Tıklanan nesneyi belirlemek; çoklu seçimde shift / kutu seçimi gibi olaylar yine tetikleyici bazlı ilerleyebilir.
- Ateş etme (hitscan): Anlık bir doğrultuda hedef testi; mermi yolu bir kerede örneklenir, sonuç anında işlenir.
- Etkileşim tetikleri: Kapı açma, eşya toplama, düğmeye basma gibi tek adımlı aksiyonlar.
- Yerleştirme / ölçüm: Bir noktayı zemine veya yüzeye “snap” etmek için tıklama anında tek ışın yeterlidir.
Drag sırasında her hareket için ayrı ışın atıyorsan, pratikte frekans yükselir; bu da seri single ile sürekli tarama arasında bir gri bölgedir — davranışı bilerek seç.
B) Continuous Raycast (sürekli ışın izleme)
Continuous Raycast, uygulamanın yaşam döngüsü boyunca (game loop / render loop) her karede yeniden hesaplanan ışındır.
Gerçek dünyada kare süresi sabit değildir: VSync, sekmeye geçiş veya cihaz yükü FPS’i değiştirir. Sürekli tarama “saniyede 60” gibi düşünülür ama uygulamada her üretilen kare için tekrarlanır; yavaşlayan bir karede bile bir kez daha ödersin.
Çalışma mantığı
Saniyede 60 kez (60 FPS) veya 120 kez (120 FPS) sahneyi yeniden tarar. Genellikle farenin o anki konumunu veya karakterin bakış yönünü takip eder.
Pratikte tetikleyici çoğu zaman pointermove ile aynı döngüye bağlanır: imleç her piksel kaydığında dünya yeniden sorulur. Bazı projeler “her kare” yerine zamanlayıcı ile (ör. 30 Hz) veya imleç mesafesi eşiği ile seyrekleştirerek aynı hissi daha ucuza yakalar.
Hesaplama yükü
Çok yüksek. Her karede kesişim testlerinin (intersection tests), filtrelemelerin ve mesafe hesaplarının baştan yapılması demektir; yanlış optimize edilirse FPS düşer.
Ek maliyet: her seferinde yeni dizi tahsis etmek (GC baskısı) yerine intersects çıktısı için önceden ayrılmış dizi kullanmak yaygın bir optimizasyondur. Frekans düşük olsa bile, bellek dalgalanması hissedilir hale gelebilir.
Kullanım alanları
- Hover efektleri: Fare bir objenin üzerine geldiği anda parlama veya imleç değişimi; odak halkası ve erişilebilirlik ipuçları da aynı sınıfta düşünülebilir.
- AI görüşü: Düşmanın oyuncunun saklanıp saklanmadığını sürekli kontrol etmesi; görüş hattı (line of sight) için dar bir ışın yeterli olsa da sıklık yüksektir.
- Dynamic UI: Bakılan noktaya göre değişen 3B arayüzler; bakış veya işaretçi ile bağlamsal araç çubuğu güncellemek buna örnektir.
- Profil / vitrin: Ürün konfigüratöründe sürekli “altındaki yüzeyi” okumak, kullanıcıya anında geri bildirim vermek.
Sürekli tarama, layer filtreleme ile aday kümesini küçültmekten büyük ölçüde faydalanır; aksi halde her karede “tüm sahne” maliyeti büyür.
Katmanların ötesinde, bounding volume ile broad-phase elemek de sürekli taramayı ucuzlatır: önce hızlı “aday mı?” sorusu, sonra dar kesişim — iki teknik birlikte en sık kullanılan kombinasyondur.
Canlı demo: Time vs Accuracy System
Aynı sahne, aynı kamera ışını; fark ne sıklıkla ray attığındadır. Hedef sürekli hareket eder: single’da tıklama dışı örneklenmez, hedef kaçabilir; continuous’ta her kare takip; optimized’ta ise her üç karede bir örneklenir — hafif gecikme, daha düşük ray/sn.
Metrics
Ray/sn —
FPS —
Hits 0 / 0
Last —
İsabet % —
CPU yükü (sim.)
—
Mode
Ray sadece tıklamada çalışır. Hedef hareket ederse kaçırabilirsin.
İpucu: Single’da hedefi yakalamak için tıklama anını zamanla; continuous’ta imleci hedef üzerinde tut.
Kritik karşılaştırma ve performans özeti
Aşağıdaki tablo, iki modeli tek bakışta karşılaştırır; proje kararında “bedel / kazanç” sözleşmesini netleştirir.
| Özellik | Single Raycast | Continuous Raycast |
|---|---|---|
| FPS etkisi | Yok denecek kadar az. | Yanlış optimize edilirse FPS’i düşürür. |
| Tepkisellik | Gecikmeli (sadece tetiklendiğinde). | Anlık (her an güncel veri sağlar). |
| Pil ömrü / CPU | Tasarruflu. | Yoğun kullanımda cihazı ısıtabilir. |
| Veri güncelliği | Sadece “o anki” durumu verir. | Sürekli değişen dünyayı takip eder. |
Optimizasyon: pahalı bir işlemi nasıl ucuzlatırız?
Eğer projenizde continuous raycast kullanmak zorundaysanız (örneğin etkileşimli bir 3B portfolyo), şu teknikler hayat kurtarıcıdır:
Frame skipping (kare atlama)
Işını her karede değil, örneğin her 3 karede bir çalıştırın. İnsan gözü bu küçük farkı çoğu zaman fark etmez; işlem yükü büyük ölçüde azalır. Pratikteki farkı Time vs Accuracy demosunda Optimized modu açarak gözlemleyebilirsin.
Distance culling
Kameradan çok uzaktaki objeleri sürekli tarama listesinden çıkarın. Çok uzaktaki bir yüzeye “hover” yapmanın pratik anlamı genelde yoktur.
Active flagging
Sadece ekranda o an hareket eden veya etkileşime açık objeleri tarayın. Statik, hiç değişmeyen objeler için önbelleğe alınmış (cached) verileri kullanın.
Holodepth stratejik notu
Bir geliştirici olarak kuralımız şu olmalı: “Eğer single raycast işini görüyorsa, asla continuous kullanma.” Ancak modern ve “premium” hissettiren bir 3B web deneyimi — Holodepth’in vizyonu gibi — genellikle akıllıca optimize edilmiş continuous raycast üzerine kurulur.