Modern oyunlarda çift veya üçlü tamponlama hangi sorunu çözer?


31

İkili (veya üçlü) arabelleğe alma nedenlerini anlamamın doğru olup olmadığını kontrol etmek istiyorum:

60Hz yenilenen bir monitör, saniyede 60 kez monitör görüntüsünü oluşturur. Monitör monitör görüntüsünü yenilediğinde, piksel için piksel ve satır için satır günceller. Monitör, video belleğindeki pikseller için renk değerleri ister.

Şimdi bir oyun çalıştırırsam, o zaman bu oyun sürekli olarak bu video hafızasını değiştiriyor.

Bu oyun bir arabellek stratejisi (çift arabellekleme vb.) Kullanmıyorsa, aşağıdaki sorun ortaya çıkabilir:

Monitör şimdi monitör görüntüsünü yeniliyor. Bu anda, ekran zaten ilk yarı ekran görüntüsünü yenilemişti. Aynı zamanda, oyun video hafızasını yeni verilerle değiştirmişti. Şimdi monitör ikinci yarı için erişiyor ve bu yeni manipüle edilmiş verileri video belleğinden izliyor. Sorunlar yırtılma veya titreme olabilir.

Tampon stratejisini kullanma durumlarını anlamam doğru mu? Başka sebepler var mı?

Yanıtlar:


62

Temel olarak, görüntülemedeki temel amaç, monitörde görüntülenen her kare için tek ve tutarlı bir görüntü sunmaktır. Bunu başarmak için kullanılan veya kullanılan birkaç farklı strateji vardır.

Aşağıda, "vsync" den bahsediyorum. Vsync, monitörün yeni bir ekran görüntüsü çizmeye başladığı andır; "vblank" in geleneksel bir CRT ekranında başladığı nokta, scanline'ın anlık olarak çizmeyi durdurup monitörün tepesine geri dönmesi. Bu an, çerçeve tutarlılığına yaklaşımların çoğu için çok önemlidir.

Bir ekran iki farklı görüntüden tek bir çerçevede alındığında, "yırtılma" diyoruz. Örneğin, birbiri ardına gösterilmesi amaçlanan iki ekran görüntüsü çizdim, ancak monitör bunun yerine çerçevenin birinci yarısını ve ikinci çerçevenin alt yarısını görüntüledi, bu "yırtılma". Bu, vblank yerine, monitör çizim sırasında monitörün okuduğu verileri değiştirmek nedeniyle olur. (Modern programlarda, bu genellikle kullanıcının sürücü ayarlarında vsync beklemesini devre dışı bırakması nedeniyle olur)

Sıfır Tampon

En eski donanımda, tam ekran görüntüyü tutmak için genellikle yeterli bellek yoktu ve bu yüzden ekran görüntüsü almak yerine, monitör her satır için ayrı ayrı renk belirtmek zorunda kaldı, monitör bu çizgiyi çiziyordu. Örneğin, Atari 2600'de, televizyon gerçekten bu tarama çizgisini çizmeye başlamadan önce, tarama çizgisinin her pikseline hangi rengin gittiğini belirtmek için sadece 76 makine talimat döngüsüne sahiptiniz. Sonra bir sonraki tarama çizgisinin içeriğini sağlamak için 76 komut döngüsüne sahip oldunuz .

Tek Tampon

Bir "tek-tampon" bağlamında çizim yaparken, doğrudan monitör tarafından okunan VRAM'a çizim yapıyorsunuz. Bu yaklaşımda, "scanline ile yarış". Genel fikir, tarama çizgisi önceki karenin içeriğini ekranın üstünde çizmeye başladığında, arkasında VRAM'a çizdiğinizdir . Bu nedenle, tarama çizgisi son karenin ekran görüntüsünü çizerken, bir sonraki kareyi tarama çizgisinin arkasına çiziyorsunuz.

Genel olarak, tekrar kendine geliyor ve almak sen misin ediyoruz çizim ve aynı zamanda asla pikselleri sollama tarafından scanline "tur" Daha önce bir sonraki kare resmi çizmeyi tamamlamak için çalışıyoruz önde başka yeni tarama çizgisine ait veya çerçeve önceki karenin ne olması gerektiğine dikkat çekebilir.

Bu nedenle, tekli arabellek oluşturma işlemi tipik olarak yukarıdan aşağıya ve soldan sağa tarama çizgileri çizerek çalıştı. Başka bir düzende çizdiyseniz, tarama çizgisinin tekrar ortaya çıkması ve henüz çizemediğiniz "sonraki" resmin parçalarını bulması olasıydı.

Modern işletim sistemlerinde, genellikle otuz yıl önce oldukça yaygın olmasına rağmen, hiçbir zaman tek tamponlu çizim yapma fırsatınız olmadığını unutmayın. (Tanrım, şu anda kendimi yaşlı hissediyorum - oyun geliştirmeye ilk başladığımda yaptığım şey buydu.)

Çift Tampon

Bu, daha önce gelen stratejilerden her ikisinden de çok, çok daha basittir.

Çift tamponlu bir sistemde, iki farklı ekran görüntüsünü saklamak için yeterli belleğe sahibiz ve bu yüzden bunlardan birini "ön tampon" ve diğerini "arka tampon" olarak adlandırıyoruz. "Ön tampon" şu anda görüntülenmekte olandır ve "arka tampon" şu anda çizim yaptığımız yerdir.

Ekran görüntüsünü arka arabelleğe çizmeyi bitirdikten sonra, vsync'ye kadar bekleyip iki arabelleği değiştiririz. Bu şekilde, arka tampon ön tampon haline gelir ve tam tersi olur ve ekran herhangi bir şey çizmiyorken tüm takas gerçekleşti.

Paket-Tampon

Çift arabellek yaklaşımlarıyla sıkça ortaya çıkan sorunlardan biri, arka ara belleğe çizmeyi bitirdikten sonra, arabellekleri değiştirmeden ve çalışmaya devam etmeden önce sadece vsync için oturup beklememiz gerektiğidir; Bu süre zarfında hesaplamalar yapıyor olabilirdik! Dahası, tamponlar arasında değişmeyi beklediğimiz her zaman, bu arka tampondaki görüntü daha da eski hale gelir, böylece kullanıcının algılanan gecikme süresi artar.

Üçlü tampon sistemlerinde kendimizi üç tampon yaratırız - bir ön tampon ve iki arka tampon. Fikir şudur:

Monitör ön tamponu görüntülüyor ve arka tampon # 1'i çiziyoruz. Monitör ön tamponu çizmeyi bitirmeden önce # 1 arka tamponuna çizmeyi bitirirsek, vsync için beklemek yerine hemen bir sonraki kareyi arka tamponla # 2 çizmeye başlarız. Bitirirsek ve vsync hala gelmediyse, tekrar # 1 arabelleğine geri dönmeye başlarız, vb. Buradaki fikir, vsync sonunda gerçekleştiğinde, arka tamponlarımızın biri veya diğeri tamamlanır ve bir tanesi ön tampon için değiştirilebilir.

Üçlü-tamponlamanın yararı, çift-tamponlama yaklaşımında vsync için harcadığımız zamanı kaybetmememizdir ve ön tampon üzerine değiştirilen görüntünün, vsync için beklemekte olandan daha "taze" olabileceğidir. 8ms. Üçlü arabelleklemenin alt tarafı, ekstra ekran görüntüsünü saklamak için fazladan belleğe ihtiyacımız olması ve CPU / GPU kullanımımızın daha yüksek olacağı (yine, vsync için beklemek için yavaşlamadığımız için).

Tipik olarak, modern sürücüler sahne arkasında, genellikle üçlü arabelleklemeyi şeffaf bir şekilde gerçekleştirir. Çift arabelleğe alma yapmak için kodunuzu yazdığınızda, sürücü aslında size erken kontrolü geri döndürür ve kodunuz farkında olmadan, kullanmak istediği birçok geri arabellek arasında geçişi yalnızca dahili olarak ele alır.

GPU satıcıları şu anda üçlü arabellekleme yapmamanızı tavsiye ediyor - sürücü sizin için otomatik olarak yapacak.


7
Bu inanılmaz derecede ayrıntılı bir cevaptır ve birçok şeyin neden olduğu gibi yapıldığını açıklar (ekran koordinat alanı gibi). Ayrıca "neden dörtlü tamponlar kullanılmıyor? Quintuple?" Arka planda tampon takas işleminin gerçekleştiğinin farkında değildim, bu da iki arka tamponun ihtiyaç duyulan maksimum değer olduğunu gösteriyor. Upvoted.
öğle yemeği317

Aslında dörtlü tamponlama var. Bu stereoskopik görünüm için çift tamponlamadır. swiftless.com/tutorials/opengl/smooth_rotation.html
Narek

@Narek Hayır. Bağlantınızdan alıntı: "Bilgisayar grafiği ortamlarında gerçek bir nokta olmadığı için gerçek dörtlü arabelleklemeyi gerçekten etkinleştiremezsiniz". Aynı anda iki farklı görüntüye çift tamponlama yapmanın “dörtlü tamponlama” olacağını öne sürmek, sadece eğlenceli bir kelime oyunu; gerçek bir şey değil.
Trevor Powell

@TrevorPowell Eklemeyi unuttuğunuz kısmı eklemek: "Eh, tipik olarak dörtlü tamponlama, stereoskopik bir ortamda çift tamponlama anlamına gelir. Şimdi bağlam daha net olabilir.
Narek

@TrevorPowell Amacınız tamamen açık olsa da. Bir render tamponu için 3'ten fazla tamponun olması mantıklı değildir.
Narek
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.