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.