En doğru cevap, onu nasıl programladığınıza bağlıdır, ancak bu endişelenmeniz gereken iyi bir şeydir. GPU'lar inanılmaz derecede hızlı olsa da, GPU RAM'e giden ve GPU'dan bant genişliği değil ve en sinir bozucu darboğazınız olacak.
Verileri GPU belleğine yalnızca bir kez gönderilip orada sonsuza kadar oturuyor mu?
Umarım, evet. Oluşturma hızı için, her kareyi yeniden göndermek yerine GPU'da olabildiğince fazla verinin olmasını istersiniz. VBO'lar bu amaca hizmet eder. Hem statik hem de dinamik VBO'lar vardır, birincisi statik modeller için en iyisidir ve ikincisi, köşeleri her kareyi (örneğin bir parçacık sistemi) değiştirecek modeller için en iyisidir. Dinamik VBO'lar söz konusu olduğunda bile, her karede tüm köşeleri yeniden göndermek istemezsiniz; sadece değişenler.
Yapınız söz konusu olduğunda, köşe verileri sadece orada oturur ve değişen tek şey matrislerinizdir (model / dünya, projeksiyon ve görünüm).
Bir parçacık sistemi söz konusu olduğunda, o sistem için var olacak maksimum parçacık sayısını depolayacak kadar büyük bir dinamik VBO yaptım. Her bir kareyi, bu kareyi yayan parçacıkların verilerini, birkaç üniformayla birlikte gönderiyorum ve hepsi bu. Çizdiğimde, o VBO'da bir başlangıç ve bitiş noktası belirtebiliyorum, bu yüzden parçacık verilerini silmek zorunda değilim. Sadece bunları çizme diyebilirim.
Model aslında her kareyi oluşturduğunda GPU işlemcilerinin verilerini her seferinde GPU belleğinden alması gerekir mi? Demek istediğim - her biri birden çok kez işlenmiş 2 modelim olsaydı - ilkini birden çok kez ve sonra ikincisini birden çok kez oluştursaydım ya da ilkini bir kez oluşturduysam, ikincisini sadece bir kez ve böyle bırakmaya devam ettiniz mi?
Sadece bir yerine birden fazla çekiliş çağrısı gönderme işlemi çok daha büyük bir sınırdır. Anlık oluşturmaya göz atın; size çok yardımcı olabilir ve bu sorunun cevabını işe yaramaz hale getirebilir. Bununla ilgili henüz çalışmadığım bazı sürücü sorunlarım vardı, ancak çalıştırabilirseniz, sorun çözüldü.
Açıkçası grafik kartlarının sınırlı RAM'i var - 1 kare oluşturmak için gerekli tüm model verilerini tutamadığında, sanırım her bir kareyi CPU RAM'inden (bazıları) getirmeye devam ediyor, doğru mu?
GPU RAM'iniz bitmek istemezsiniz. Eğer öyleyse, o zaman bir şeyleri değiştirerek değiştirmeyin. Yaptığınız varsayımsal senaryoda, muhtemelen bir şekilde çökecek, ama bunun olduğunu hiç görmedim, bu yüzden dürüstçe bilmiyorum.
Bir ayrım yapmayı unuttum: GPU'ya veri gönderiyor ve arabellekleri güncel olarak ayarlıyor / bağlıyor. İkincisi herhangi bir veri akışına neden oluyor mu?
Önemli bir veri akışı yok, hayır. Bunun bir maliyeti var, ancak bu yazdığınız her kod satırı için geçerlidir. Size maliyetinin ne olduğunu bulmak yine profil oluşturmanın ne için olduğunu.
başlatma ile tampon oluşturma
Raxvan'ın cevabı kulağa hoş geliyor, ama tam olarak doğru değil. OpenGL'de, arabellek oluşturmak herhangi bir yer ayırmaz . Herhangi bir veri iletmeden yer ayırmak istiyorsanız glBufferData öğesini çağırabilir ve null iletebilirsiniz. ( Buradaki notlar bölümüne bakın .)
arabellek veri güncellemesi
Sanırım glBufferData veya bunun gibi diğer işlevler demek değil mi? Gerçek veri aktarımı burada gerçekleşir. (Son paragrafta söylediğim gibi boş kalmazsanız.)
arabellek etkin olarak bağlama (sadece API bu arabellek sonraki beraberlik çağrısı işlenmesini istiyorum ve kendi başına bir şey yapmaz söylemek bir yolu var mı?)
Evet, ama bundan biraz daha fazlasını yapabilir. Örneğin, bir VAO'yu (köşe dizisi nesnesi) bağlarsanız, bir VBO'yu bağlarsanız, o VBO VAO'ya bağlanır. Daha sonra, VAO'yu tekrar bağlar ve glDrawArrays'i çağırırsanız, hangi VBO'nun çizileceğini bilecektir.
Birçok öğretici her VBO için bir VAO oluşturmanıza rağmen, bunun amaçlanan kullanımı olmadığı söylendi. Sözde bir VAO oluşturmalı ve bunu aynı özelliklere sahip her VBO ile kullanmalısınız. Bunu henüz denemedim, bu yüzden daha iyi ya da kötü olup olmadığını kesin olarak söyleyemem.
API çizim çağrısı
Burada olanlar oldukça basittir (bizim açımızdan). Bir VAO bağladığınızı ve ardından glDrawArrays'ı arayın. Bir başlangıç noktası ve bir sayı belirtirsiniz ve o aralıktaki her köşe için köşe gölgelendiricinizi çalıştırır, bu da çıktılarını satırdan geçirir. Bütün bu süreç kendi başına bir başka denemedir.