GL_STATIC_DRAW vs GL_DYNAMIC_DRAW vs GL_STREAM_DRAW: önemli mi?


12

OpenGL'de, arabellek nesnesi işlevleri ( glBufferData, glBufferSubDatave muhtemelen birkaç diğerleri) usage, muhtemelen uygulamanın daha iyi performans vermesine yardımcı olmayı amaçlayan, amaçlanan kullanımın bir ipucu olarak dokümantasyon tarafından tanımlanan bir parametreye sahiptir .

kullanım

Veri deposunun beklenen kullanım şeklini belirtir. Sembolik sabit olmalıdır GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, veya GL_DYNAMIC_COPY.
[...]
kullanımı, bir arabellek nesnesinin veri deposuna nasıl erişileceğine ilişkin GL uygulaması için bir ipucudur. Bu, GL uygulamasının arabellek nesnesi performansını önemli ölçüde etkileyebilecek daha akıllı kararlar vermesini sağlar. Bununla birlikte, veri deposunun gerçek kullanımını kısıtlamaz.

Wiki de benzer şekilde belirsiz:

Ne de olsa bunlar sadece ipuçları. Bir STATIC arabelleği oluşturulduktan sonra değiştirmek veya bir STREAM arabelleğini asla değiştirmemek tamamen yasal OpenGL kodudur.
[...]
Bunlar sadece dikkatli profilleme ile cevaplanabilecek sorular. Ve o zaman bile, cevap yalnızca söz konusu donanım satıcısının söz konusu sürücü sürümü için doğru olacaktır.

Peki, bu parametre hiç değilse ne kadar ilgili? Sürücüler bunu gerçekten dikkate alıyor mu ve eğer öyleyse, deneyiminizde pratikte performansı ne kadar etkiliyor? Paylaşacağınız veriler var mı?

Mevcut API'lardan biri olarak uygulanması gereken ince bir grafik API soyutlama katmanı yazdım ve sadece bu parametreyi tamamen yok saymak ve açık soyutlamadan gizlemek cazip geliyor.

Yanıtlar:


7

Bu, uygulamalar arasında değişiklik gösterecektir, ancak üzerinde çalıştığım sürücü bunları temel olarak bellek düzenine karar vermek için kullandı. Bu ipuçları istiyorum çok daha küçük tarafından optimizasyonlar başlıca nedeni bu kısıtlama, etkin olabilir Verdiğiniz her türlü ipuçları herhangi kullanımını yapmak. örneğin, yalnızca okuma erişimi için işaretlenen arabelleklerin hiç yazılamaması durumunda önbellek geçersiz kılma çok daha ucuz olur, ancak bu optimizasyon imkansızdır.

GPU'lar arasında karşılaştırma karşılaştırmaları için yaygın olarak kullanılan bazı önemli oyunlar bu ipuçlarını doğru şekilde kullanmaz, bu nedenle GPU satıcıları ipuçlarıyla eşleşmese bile tüm kullanımları hızlı yapmak için bir teşvike sahiptir.


4

İşlevsel olarak aynılar.

Sürücü, tamponu sahnelerin arkasında nasıl kullanacağını ayırt etmek için bunları kullanabilir. Örneğin static_draw mümkün olan en kısa sürede vram'a kopyalanıp orada bırakılacak ancak stream_read'in RAM'de her zaman güncel bir kopyası olacaktır.

Bu belirsizlik glBufferStorage'ın bir şey haline gelmesinin nedenidir . Bu şekilde, arabellekle ne yapmak istediğinizi belirlersiniz (BufferSubData aracılığıyla güncelleyip güncellemeyeceğiniz, bir harita üzerinde okuma veya yazma işlemi, eşlemenin ne kadar tutarlı olduğu, eşlemenin kullanımlarda devam edip edemeyeceği) ve bu sınırların dışına çıkmak bir hatadır.

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.