İçeriğe geç

Mimari

Arayüz iş parçacığı, çözücüyü ve çiziciyi barındıran simülasyon worker’ıyla konuşur

rust-core/ çözücü (Rust, WebAssembly'ye derlenir)
src/sim.rs Simulation: alanlar, çekirdekler, kaynaklar, problar, genel API
src/cpml.rs soğurucu sınır profilleri ve durumu
src/sources.rs dalga biçimleri, nokta kaynaklar, 1B ızgaralı TF/SF çizgisi
src/materials.rs malzeme tablosu ve güncelleme katsayıları (Drude dahil)
src/geometry.rs şekillerin malzeme ızgarasına kırpılarak çizilmesi
src/monitors.rs prob halka tamponları ve FFT
tests/physics.rs doğrulama testleri
pkg/ üretilen bağlamalar, depoya eklenir (bkz. Derleme)
web/ uygulama (React, TypeScript, Vite)
src/engine/ worker, WebGL çizici, protokol, cihaz ölçümü
src/scene/ sahne belgesi: tipler, hazır sahneler, doğrulama, dosyalar, bağlantılar
src/state/ zustand depoları, geri alma geçmişi, komutlar
src/ui/ bileşenler, simgeler, tasarım değişkenleri
docs/ bu site (Astro Starlight)
tools/ ekran görüntüsü ve şekil üreteçleri

Tüm durum tek bir Simulation yapısında durur. Alanlar satır sıralı düz f32 dizileridir. Her hücre ayrıca tek baytlık bir malzeme kimliği tutar; güncelleme katsayıları 64 girdilik bir tablodan okunur ve yalnızca geometri ya da tablo değiştiğinde yeniden oluşturulur.

TM ve TE, Çözücü nasıl çalışır sayfasında anlatılan ikilik sayesinde aynı iki çekirdeği paylaşır. Çekirdekler ızgarayı satır satır, eşit uzunluktaki dilimler üzerinde yineleyicilerle dolaşır; bu sınır denetimlerini kaldırır ve LLVM’in döngüleri WebAssembly SIMD için vektörleştirmesine izin verir. Soğurucu sınır yalnızca kenar şeritleri üzerinde bir düzeltme geçişi olarak uygulanır; böylece iç döngüler dallanmasız kalır.

Kaynaklar ve problar çözücünün içinde yaşar. JavaScript her karede bir kez step(n) çağırır; çözücü her adımda kaynakları uygular ve probları kaydeder, WebAssembly sınırında hiçbir kopyalama olmaz. Alan verisi WebAssembly belleğine bakan bir işaretçi üzerinden yerinde okunur.

Derlenmiş modül yaklaşık 80 KB’tır (gzip ile 35 KB).

web/src/engine/sim.worker.ts çözücüyü ve zaman döngüsünü yönetir. Tarayıcı destekliyorsa tuval worker’a bir OffscreenCanvas olarak aktarılır ve WebGL 2 ile orada çizilir; arayüz iş parçacığı alan verisine hiç dokunmaz. Eski tarayıcılarda worker her kareyi ana iş parçacığına gönderir, o da aynı çizici sınıfıyla çizer.

Döngüyü ana iş parçacığındaki requestAnimationFrame geri basınçla sürer: bir önceki bitmeden yeni bir tik gönderilmez. Her tik, geçen gerçek süre için istenen hızın kaç adım gerektirdiğini hesaplar ve bunu bir zaman bütçesiyle sınırlar. Böylece 60 Hz ve 120 Hz ekranlar simülasyonu aynı hızda çalıştırır.

Açılışta worker 512² bir ızgarada birkaç düzine adımın süresini ölçer ve cihazın normal hızda taşıyabileceği en büyük ızgarayı seçer (engine/quality.ts).

Tek bir tam ekran üçgen ve tek bir parça gölgelendirici. Alan her karede bir R32F doku olarak yüklenir ve elle aradeğerlenir (kayan noktalı dokular her GPU’da süzülemez). Malzeme kimlikleri ikinci bir R8UI dokudur; gölgelendirici kimliğin değiştiği yerlerde taramaları ve bir aygıt pikseli kalınlığında kenar çizgilerini çizer. Renk haritaları 256 × 1 arama dokularıdır. Pozlama otomatiktir: worker birkaç karede bir alanın aralıklı bir örneğinin %99,5’lik yüzdeliğini alır.

Sahne (geometri, kaynaklar, problar, malzemeler ve ayarlar, hepsi nm cinsinden) bir zustand deposundaki düz bir nesnedir ve tek doğruluk kaynağıdır. Düzenlemeler onu değiştirmeden yenisiyle değiştirir; geri alma da böylece bir başvuru yığını olur. Küçük bir köprü (state/engine.ts) depoyu izler ve değişen parçaları worker’a gönderir.

Bileşenler dar seçicilere abone olur; böylece saniyede 10 kez gelen telemetri yalnızca durum çubuğunu yeniden çizer. Grafikler veri geldiğinde React’in çizim döngüsünün dışında doğrudan kendi tuvallerine çizer.

Dışarıdan gelen her şey (sahne dosyaları, paylaşım bağlantıları, yerel depolama) depoya ulaşmadan önce scene/validate.ts’ten geçer.