“Sprite batching” in teknik tanımı nedir?


17

Platform ve dil agnost olarak, sprite toplu işlemi nasıl tanımlanır? Sanki çizim yaparken iş miktarını azaltmak için birçok farklı teknik varmış gibi görünüyor ve genellikle "harmanlama" ile dolu. Bana gerçek bir cevap gelmeyebilir, ama belki de burada biri olmayan bir şey buldum.

Yanıtlar:


14

Teknik olarak, "gruplama" birden çok eylemi ve verilerini tek bir veri yapısına yerleştirir, böylece hepsi tek tek değil, aynı anda yürütülebilir.

Modern GPU'ların en büyük darboğazları çalışma gücü değil, CPU'da çalışan oyununuz ile GPU arasındaki iletişimdir. GPU'ya gönderilen her veri paketinin bir ek yükü vardır, ancak küçük bir paketin ek yükü büyük bir paketinki kadar büyüktür, bu yüzden yüz küçük olandan ziyade büyük bir paket gönderdiğinizde büyük bir kazançtır. Toplu iş budur; daha küçük olanlardan büyük bir paket yapmak.

Toplu işlem, hareketli grafik başına gülünç derecede küçük miktarda veri olması nedeniyle hareketli görüntüler için özellikle yararlıdır; dört köşe ve dört tex. Yani küçük paketin yükü orantılı olarak büyük.


1
Gecikme probleminden bahsettiği için +1; bu, ağ trafiği ve disk G / Ç için de geçerli olan aynı prensiptir - genel durumda, çok az sayıda büyük grup çok sayıda küçük partiyi koyar.
Maximus Minimus

9

Sprite toplu işlemi, GPU'ya tek bir çizim çağrısıyla birden fazla sprite gönderme yöntemidir.

Diğer cevapların hiçbiri bunu yapmanın asıl amacına işaret etmiyor: durum değişikliklerini ve GPU komut gönderimlerini en aza indirme. Çizdiğim 100 sprite varsa, her biri kendi dokusuna sahipse, donanım bir seferde yalnızca bir sprite işleyebilir. Düzinelerce hatta binlerce gölgelendirici göbeği neredeyse hiç kullanılmıyor ve GPU, doku anahtarları için oluşturma durumunu yapılandırmak için çok fazla zaman harcıyor.

Tüm hareketli grafik görüntülerinizi atlasa koyarsanız, çizmek için gereken durum değişikliklerini en aza indirebilirsiniz. Sürücü, donanımın tam olarak kullanılabilmesi için hareketli grafik çizme isteklerini otomatik olarak tek bir toplu işte bile birleştirebilir, ancak bu garanti edilmez veya olası değildir.

Bir hareketli grafik atlası kullanır ve ardından tüm hareketli dörtlülerinizi içine alan tek bir VBO oluşturursanız, bu verilerle tek bir çizim isteği yaparsanız, donanımın tamamen kullanıldığından ve tüm hareketli grafiklerinizin paralel olarak oluşturulduğundan emin olursunuz.

Sprite batching o zaman bu şeyi yapıyor: GPU kullanımını en üst düzeye çıkararak, GPU'ya tek bir çizim çağrısıyla gönderilen tek bir atlas kullanarak spritelarınızın mümkün olduğunca çok sayıda tek bir VBO'ya yerleştirilmesi.

Sprite yığınlama yapmanın başka yolları (donanım örnekleme, geometri gölgelendiricileri kullanma, vb.) Ve bunu yapmanın diğer faydaları vardır, ancak bunun amacı, toplu işlemin çizim çağrısı başına birden fazla nesne çizmek anlamına gelmesidir.


-1: Durum değişikliklerini en aza indirmek, toplu işin "noktası" değildir. Bu sadece OpenGL'nin yapılandırılma biçiminden gelen bir gerekliliktir. (Bu doku atlas noktasıdır, ancak bunlar istenmedi.) Soru özellikle "Platform ve dil agnostik olarak" tanımını soruyor.
API-Beast

Yani her şeyi bir backbuffer'a çizim yöntemi ilk önce bu problemi nasıl çözer? Veriler bellekteki tek bir görüntüye her seferinde tek bir işlem yapılmıyor mu ve daha sonra ön arabelleğe aktarılmıyor mu? Bence anlayışım biraz kusurlu olmalı.
Bloodyaugust

4
Bay Beast: OpenGL veya herhangi bir platform veya dil ile ilgisi yok. Donanımın kendisi, herhangi bir dili kullanan tüm platformlarda ve tüm grafik API'larında gerçekte böyle çalışır.
Sean Middleditch

6

Sıkı tanımlanmış bir teknik terim değil. Toplu işlem temel olarak tek tek değil, birden çok işlemi küme olarak gerçekleştirdiğiniz herhangi bir sistemdir ve genellikle bu daha verimli olduğu için yapılır. Verimlilik kazanımları genellikle işlemin gerektirdiği bağlamın bir kısmını veya tamamını yeniden kullanabilmekten gelir.

Bu nedenle, hareketli grafik, aynı anda birden fazla hareketli grafik çizmenizi ve umarım bundan bir miktar etkinlik elde etmenizi sağlayan herhangi bir sistemdir. Genellikle yararı, sprite partinizin hepsinin aynı dokuyu kullanmasıdır, böylece nispeten yavaş bir işlem olan dokuyu değiştirmeden partideki tüm spriteları çizebilirsiniz.

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.