“Scanline Racing” nedir


13

VR üzerinde çalışan birçok insanın tarama çizgisi yarışları hakkında konuştuğunu ve hareket-foton için gecikmeyi artırmaya yardımcı olması gerektiğini duydum. Ancak bunun OpenGL ile nasıl yapılabileceği net değil. Birisi tarama çizgisi yarışının nasıl çalıştığını ve modern GPU'lara nasıl uygulanabileceğini açıklayabilir.

Yanıtlar:


14

GPU'nuz ekranda yeni bir çerçeve gösterdiğinde, görüntüyü "scanout" adı verilen bir işlemde HDMI kablosu (veya her türlü) üzerinden aktarır. Pikseller doğrusal sırayla gönderilir, genellikle soldan sağa ve yukarıdan aşağıya. İşlem, bunu yapmak için bir yenileme aralığının süresinin çoğunu alacak şekilde zamanlanır. Örneğin, 60Hz'de bir kare ~ 17 ms'dir. Her scanout muhtemelen 15-16 ms sürer, 1-2 ms vblank arasındadır (kesin değerler ekrana ve video moduna göre değişir).

Geleneksel olarak oluşturma işlemi çift arabelleğe alınır, yani GPU belleğinde depolanan iki tampon vardır: biri şu anda taranır ("ön tampon") ve diğeri ("arka tampon") olarak işlenir. Her kare, ikisi değiştirilir. GPU, hiçbir zaman taranan aynı arabelleği oluşturmaz, bu da eksik bir çerçevenin bölümlerini potansiyel olarak görmesi nedeniyle yapaylıkları önler. Bununla birlikte, bunun bir yan etkisi, gecikmenin artmasıdır, çünkü her çerçeve taranmaya başlamadan önce birkaç ms boyunca tamponda oturabilir.

VR çok gecikmeye duyarlıdır, bu yüzden bu arzu edilmez. Alternatif bir yaklaşım, doğrudan ön arabelleğe dönüştürmektir, ancak her şeyi dikkatli bir şekilde zaman aşımına uğratın, böylece scanout oraya varmadan kısa bir süre önce görüntünün her satırını oluşturmuş olursunuz. Buna "scanline yarışları" veya "ışın yarışları" denir ("ışın", CRT günlerine kadar geri döner). Bu az ya da çok görüntüyü tarama çizgisi sırasında, yani piksellerin tarandığı sırayla oluşturmanızı gerektirir. Kelimenin tam anlamıyla bir seferde bir satır oluşturulmasına gerek yoktur - birkaç piksel yüksekliğinde ince şeritler halinde oluşturulabilir, ancak geri dönüp zaten olan pikselleri düzenleyemeyeceğiniz için sırayla yapılması gerekir. tarandı.

Bu yaklaşımın birçok dezavantajı vardır; çok sıkı performans gereksinimleri vardır, vsync'e karşı çok dikkatli bir şekilde zamanlanması gerekir ve oluşturma işlemini büyük ölçüde karmaşıklaştırır. Ancak prensip olarak, gecikme sürenizden milisaniye uzaklaştırabilir, bu yüzden VR kullanıcıları bununla ilgilenir.


1
Benim sorum şu ki, bunu modern GPU'larda nasıl yapıyoruz? Scanout'u sorgulamanın herhangi bir yolu olduğunu düşünmüyorum ve bana göre tarama başına çizme çağrılarını gerçekten gönderemezsiniz. Yapabilseniz bile - çekilişlerinizin scanout'tan önce oraya gideceğine dair hangi garantilere sahipsiniz?
Mokosha

1
@Mokosha Doğru, scanout'u doğrudan AFAIK'ı sorgulamanın bir yolu yok. En iyi ihtimalle, vsync'in ne zaman olduğunu (bazı işletim sistemi sinyalleri aracılığıyla) anlayabilir ve buna göre zamanlama yaparak (video modunun ayrıntılarını bilerek) scanout'un nerede olduğunu tahmin edebilirsiniz. Oluşturma için glFlush ile oluşturma işleminin ne kadar sürdüğünü öğrenmeyi deneyebilir ve buna dayalı olarak bazı tahminler yapabilirsiniz. Sonuçta, hata durumunda zamanlamanızda biraz gevşeklik (örneğin, scanout'un 2-3 ms önünde durun) ve muhtemelen ara sıra eserlerin olacağını kabul etmeniz gerekir.
Nathan Reed

Artan gecikmenin etkisi, ön ve backbuffer takaslarının monitörün vblank ile senkronize olmasına neden olan vsync'den kaynaklanır. Çift arabelleğe almanın kendisi bu soruna tek başına neden olmaz ve bir piksel ön tamponda yalnızca bir kez değişebileceğinden titremeyi en aza indirmek yararlıdır.
Maurice Laveaux

Tarama satırı sorgusu olmadan rasterleri tahmin etmenin doğru bir yolunu buldum, aşağıdaki cevaba bakınız.
Mark Rejhon

0

Harika olan şey, nihayetinde tarama hattı sorgusuna erişim olmadan tarama hattı kesin raster doğruluğunu tahmin edebilmemizdir:

https://www.youtube.com/watch?v=OZ7Loh830Ec

Bir gözyaşı hattının konumunu tahmin etmek için bir VSYNC ofseti olarak tam mikrosaniye doğruluğu formülleri buldum. VSYNC OFF sırasında gözyaşı çizgileri her zaman raster-kesindir, böylece tekrarlanan VSYNC OFF tampon değişimi yoluyla şerit seviyesi "simüle edilmiş ön tampon oluşturma" sırasında görünürlükten uzaklaştırabilirsiniz.

Forum dizisine dikkat edin - sürekli olarak eklenen bazı açık kaynak kodları vardır - https://forums.blurbusters.com/viewtopic.php?f=10&p=32002


0

İlgileniyorsa, Dreamcast'in "ışınla yarışan" görüntü oluşturma modu vardı, böylece bellek tamponu piksellerine (örn. 64 tarama çizgisi) nispeten küçük bir kısmını ayırabiliyordu ve sırayla 32 satır oluşturuyordu. ekran güncellemesi. Ancak bu sadece hafızadan tasarruf etmek için kullanıldı. Herkesin ekranın sonraki bölümleri için "değiştirilmiş" geometri oluşturduğundan şüpheliyim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.