VBO'lar ile genellikle iki önemli avantajınız vardır.
Avantaj 1, tamamen statik verilerle ilgilidir ve tepe noktası verilerinizi GPU için daha uygun olan bellekte tutabilmekten gelir.
Avantaj 2, dinamik verilerle ilgilidir ve tepe noktası verilerinizi oluşturma için kullanmadan önce herhangi bir zamanda belirleyebilmekten gelir ve bu da daha iyi boru hattı oluşturabilir.
Üçüncü bir avantaj, beraberlik çağrı toplu işleminden gelir, ancak eski okul köşe dizileriyle de paylaşılır, bu yüzden özellikle VBO'lar için çağırmıyorum. GPU'ya veri göndermek (veya zaten GPU'da veri kullanmak) disk G / Ç ve ağ trafiğine birçok yönden benzer - birkaç büyük partiniz varsa birçok küçük partiden daha verimlidir.
Bunun için iyi (% 100 doğru değil, fikir edinmenize yardımcı olacak kadar) bir benzetme, bir şehirden diğerine 50 kişi getirmek zorunda olan bir otobüs şoförüyseniz. Bunları birer birer yükleyebilir ve 50 ayrı seyahat yapabilirsiniz - bu glBegin / glEnd. Alternatif olarak, bunların 50'sini otobüse koyabilir ve sadece tek bir yolculuk yapabilirsiniz - bu, tepe dizileri veya VBO'larla toplu iş yapar (VBO durumunda 50 kişi zaten otobüste olurdu;)).
Bu bir fiyata geliyor ve burada fiyat, köşe verilerini istediğiniz gibi ve ne zaman belirtebileceğinizi kaybetmenizdir. Tamam, bunu yapabilirsiniz (bazı ek çalışmalarla), ancak tüm performansı kodunuzdan çıkarmayacaksınız. Bunun yerine, köşe verileriniz, nasıl kullanıldığı, nasıl (ve eğer) güncellenmesi gerektiği, gölgelendiricide herhangi bir animasyonun yapıp yapamayacağı hakkında daha fazla düşünmeniz gerekir (böylece verilerin statik kalmasını sağlar - VBO'lar gerçekten çok sayıda animasyon vakası) veya her çerçevede köşe verisine saygı duymanız gerekip gerekmediği, ikincisi varsa etkili güncelleme stratejileri vb. yapmazsanız ve sadece naif bir dönüşüm uygularsanız, sadece sonuçta aslında daha yavaş çalıştırmak için bir sürü işte!
Bu, ilk karşılaştığınızda çok fazla iş gibi görünebilir, ama gerçekten değil. Böyle düşünme moduna girdiğinizde, bunun inanılmaz derecede kolay olduğunu ve neredeyse doğal olarak geldiğini göreceksiniz. Ancak ilk birkaç denemenizi berbat edebilirsiniz ve eğer öyleyse cesaretiniz kırılmamalıdır - berbat etmek yanlış yaptığınız şeyi öğrenmek için bir fırsattır.
Birkaç son düşünce.
Model verilerinizin VBO'ya kolayca yüklenebilecek bir biçimde olması, tüm bu işlemi sizin için çok daha kolay hale getirebilir. Bu, en azından ilk başta (ve işlemden daha rahat olana kadar) daha karmaşık veya egzotik formatlardan kaçınmanız gerektiği anlamına gelir; öğrenirken işleri olabildiğince basit ve basit tutun ve yanlış gitmek için daha az şey ve yanlış gittiğinde (veya ne zaman!) hata aramak için daha az yer olacaktır.
İnsanlar bazen optimize edilmiş / sıkıştırılmış glBegin / glEnd uygulamasından daha fazla bellek kullanan bir VBO uygulaması görürlerse ertelenir (hatta "atık" olarak da adlandırılabilir). Böyle olma. Aşırı durumlarda dışında, bellek kullanımı gerçekten değil o önemli. Burada açık bir denge - önemli ölçüde daha yüksek performans karşılığında potansiyel olarak daha yüksek bellek kullanımını kabul ediyorsunuz. Ayrıca, hafızanın kullanılabilecek ucuz ve bol bir kaynak olduğu fikrini geliştirmeye yardımcı olur; performans değildir.
Ve son olarak eski kestane - zaten yeterince hızlıysa, işiniz yapılır. Hedef kare hızınızı vuruyorsanız, geçici koşullar için boşluk varsa, o zaman yeterince iyidir ve bir sonraki adıma geçebilirsiniz. Gerçekten ihtiyaç duymayan bir şeyden% 10 daha fazla sıkarak çok fazla zaman ve enerji harcayabilirsiniz (orada bulunmuş, bunu yapmış, yine de tuzağa düşüyor), bu yüzden her zaman kendi zamanınızın en uygun kullanımının ne olduğunu düşünün - çünkü programcı zamanı performanstan daha ucuz ve daha az bol!