OpenGL optimizasyon ipuçları [kapalı]


26

OpenGL'yi daha verimli hale getirmek için ne gibi ipuçlarına sahipsiniz?

Yanıtlar:


16

GlStart () / glEnd () yerine VBO kullanın. Bu, verilerin GPU belleğine aktarılmasında döngüleri kurtarır.


7
Bundan daha fazlası, glBegin ve glEnd sonraki revizyonlarda kullanımdan kaldırıldı ve 3.x ve daha üst sürümlerde tamamen kaldırıldı (ve bu nedenle çalışmayacaklar). Bir OpenGL 3.x içeriği talep ederseniz, bunları tamamen kullanamazsınız.
Slurps Mad Rips,

DirectX aslında bunu size zorlar, eşdeğeri yoktur glStart()/glEnd().
knight666

@SAHChandler Bunu bilmiyordum. İtiraz edildiğini farketmedim.
MrValdez

3
@SAHChandler: Bu berbat! Tüm çizimimi glBegin () ve glEnd () ile öğrendim. Noooo !!!

8

Aletler biraz farklı olsa da, standart profil, profil, profil burada da geçerlidir.

gDEBugger , tam olarak başlık altında neler olduğunu görmenize yardımcı olmakta harika. Yine de pahalı.


2
Sadece şimdi ücretsiz olduğunu eklemek istedim.
DMan

8

Bunlar, Apple’ın OpenGL’deki dokümantasyon referanslarındandır, ancak her küçük parça doğru yardımcı olur mu? ;)

OpenGL Performans Optimizasyonu: OS X'te OpenGL Veri Çıkışını Optimize Etme Temelleri

(Bu sonuncusu örnek bir uygulamadır)
Vertex Optimizasyonu

Ayrıca, OpenGL uzantıları hakkında konuşan çok sayıda video da var (Ayrıca Apple'dan). Bazıları OS X'e özgüdür, ancak birkaç diğerleri daha genelleştirilmiştir ve büyük olasılıkla Windows ve Linux'a uygulanabilir.

Videoları burada bulabilirsiniz . Ancak bunları görüntülemek için iTunes'a ve bir Apple hesabına ihtiyacınız var (ancak ücretsiz!: D)


7

Peki, gerçekten, gerçekten ne yapmayı planladığınıza bağlı, ama işte temeller:

  • GPU'nuz aç bir canavar iken CPU'nuz çok değerlidir. GPU’ya mümkün olduğunca ofset. Bugünlerde OpenCL, CUDA ve Thrust gibi mükemmel kütüphanelerle bunu yapabilirsiniz.

  • Aydınlatmanızı gölgelendiricide yapın. Bu sadece akıl sağlığınızı korumanıza yardımcı olmakla kalmayacak, aynı zamanda toon gölgelendiriciler ve ertelenmiş ışıklandırma gibi şeyleri çok serinletmenize de izin veriyor .

  • Parçacıklar emmek. OpenGL point sprite kullanırken bile.


6

Durum değişikliklerinizi en aza indirin. Birçok platformda, her durum değişikliği potansiyel olarak boru hattını temizler. Birbirine benzer öğeleri bir araya getirmek ve durumu bir kez değiştirmek çok daha iyidir.


4
glEnable(GL_CULL_FACES);

Arka yüzü temizleme işlemini uygulayan basit bir astar. Bu, poligon sayısının düzeltilmesi için mükemmeldir. Ayrıca, poli sayımlarını azaltmak için Frustum / Occlusion ürünlerine bakın.

Bakılması gereken başka bir şey de vektörleriniz ve kuaterniyonlarınız için SIMD'dir (çoğunlukla kamera rotasyonlarında kullanılır). ASM ile uğraşmak istemiyorsanız, C'deki SIMD'yi kullanmak için harika bir kütüphane olan libSIMD'ye göz atın.


4

Yerel değişkenlere erişirken glGet * kullanmayın, örneğin:

  • OpenGL’den dokuların ebatlarını sorgulamayın, değişkenleri yüklenirken saklayın
  • Değişiklikleri uygulamanıza kaydederken OpenGL'den satır genişlikleri / puan boyutlarını sorgulamayın

Bu aramalar gerçekten yavaş

Kullanılmayan şeyleri içinde değişmezse glBegin - glEnd yan tümcesinin dışına taşıyın (glColor veya glNormal veya başka bir şey olsun). OpenGL bir durum makinesidir, son değeri kullanır.


3

OpenGL komutlarını simge durumuna küçültmek anahtardır. Bu yüzden tüm çizim komutlarını toplu olarak almalısınız. 2d oyunlar için Altas Texture kullanmak ve aynı dokuyu paylaşan tüm sprite'ları tek bir opengl komutunda çizmek iyi bir fikirdir.


Dikkatli ol. Daha az ve daha büyük partiler yararlıdır, ancak hedef platforma bağlı olarak "çok büyük" gruplar performansı düşürür.
Andreas,

3

Toplu iş, toplu iş, toplu iş !! (Ab) her çizim çağrısında mümkün olduğu kadar işlemek için GPU'yu kullanın. Oyunlar genellikle devlet değişikliği ile sınırlıdır, üçgen miktarı ile sınırlı değildir.

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.