GLSL'de dallanmaya neden olan şey GPU modeline ve OpenGL sürücü sürümüne bağlıdır.
Çoğu GPU, dallanma maliyeti olmayan bir "iki değerden birini seçme" işlemi şeklinde görünmektedir:
n = (a==b) ? x : y;
ve bazen bile böyle şeyler:
if(a==b) {
n = x;
m = y;
} else {
n = y;
m = x;
}
Dallanma cezası olmadan birkaç seçme değeri işlemine indirgenir.
Bazı GPU / Sürücüler karşılaştırma operatörü üzerinde iki değer arasında bir miktar ceza almış (?) Ve sıfıra kıyasla daha hızlı bir işlem yapmıştır.
Bunu yapmak daha hızlı nerede olabilir:
gl_FragColor.xyz = ((tmp1 - tmp2) != vec3(0.0)) ? E : tmp1;
(tmp1 != tmp2)
doğrudan karşılaştırmak yerine bu çok GPU'ya ve sürücüye bağlıdır, bu yüzden çok özel bir GPU hedeflemiyorsanız ve başkaları yoksa karşılaştırma işlemini kullanmanızı öneririm ve bu optimizasyon işini OpenGL sürücüsüne başka bir sürücünün daha uzun formla ilgili bir sorunu olabilir ve daha basit, daha okunaklı bir şekilde daha hızlı olun.
"Şubeler" de her zaman kötü bir şey değildir. Örneğin, OpenPandora'da kullanılan SGX530 GPU’da, bu scale2x gölgelendiricisi (30ms):
lowp vec3 E = texture2D(s_texture0, v_texCoord[0]).xyz;
lowp vec3 D = texture2D(s_texture0, v_texCoord[1]).xyz;
lowp vec3 F = texture2D(s_texture0, v_texCoord[2]).xyz;
lowp vec3 H = texture2D(s_texture0, v_texCoord[3]).xyz;
lowp vec3 B = texture2D(s_texture0, v_texCoord[4]).xyz;
if ((D - F) * (H - B) == vec3(0.0)) {
gl_FragColor.xyz = E;
} else {
lowp vec2 p = fract(pos);
lowp vec3 tmp1 = p.x < 0.5 ? D : F;
lowp vec3 tmp2 = p.y < 0.5 ? H : B;
gl_FragColor.xyz = ((tmp1 - tmp2) != vec3(0.0)) ? E : tmp1;
}
Bu eşdeğer gölgelendiriciden (80ms) çok daha hızlı sona erdi:
lowp vec3 E = texture2D(s_texture0, v_texCoord[0]).xyz;
lowp vec3 D = texture2D(s_texture0, v_texCoord[1]).xyz;
lowp vec3 F = texture2D(s_texture0, v_texCoord[2]).xyz;
lowp vec3 H = texture2D(s_texture0, v_texCoord[3]).xyz;
lowp vec3 B = texture2D(s_texture0, v_texCoord[4]).xyz;
lowp vec2 p = fract(pos);
lowp vec3 tmp1 = p.x < 0.5 ? D : F;
lowp vec3 tmp2 = p.y < 0.5 ? H : B;
lowp vec3 tmp3 = D == F || H == B ? E : tmp1;
gl_FragColor.xyz = tmp1 == tmp2 ? tmp3 : E;
Belirli bir GLSL derleyicisinin veya belirli bir GPU'nun, kıyaslama yapana kadar nasıl bir performans göstereceğini önceden asla bilemezsiniz.
Noktaya eklemek için (bu kısım için size sunacak gerçek zamanlama numaralarım ve gölgelendirici kodum olmasa bile) şu anda normal test donanımım olarak kullanıyorum:
- Intel HD Graphics 3000
- Intel HD 405 Grafik
- nVidia GTX 560M
- nVidia GTX 960
- AMD Radeon R7 260X
- nVidia GTX 1050
Test etmek için çok çeşitli, yaygın, GPU modelleri olarak.
Her birini Windows, Linux tescilli ve Linux açık kaynaklı OpenGL & OpenCL sürücüleri ile test etmek.
Ve her zaman belirli bir GPU / Sürücü combo için GLSL gölgelendiricisini (yukarıdaki SGX530 örneğinde olduğu gibi) veya OpenCL işlemlerini mikro-optimize etmeye çalıştığımda , diğer GPU'ların / Sürücülerin birden fazlasında performansı eşit derecede incitiyorum.
Açıkça yüksek seviye matematiksel karmaşıklığı azaltmaktan (ör: 5 aynı bölümü tek bir karşılıklı ve 5 çarpıma dönüştürmek) ve doku aramalarını / bant genişliğini azaltmak dışında, büyük olasılıkla zamanınızı boşa harcarsınız.
Her GPU diğerlerinden çok farklı.
Özellikle (a) belirli bir GPU'lu oyun konsolu / konsollarında çalışıyor olsaydınız, bu farklı bir hikaye olurdu.
Bunun (küçük oyun geliştiricileri için daha az önemli ama yine de dikkat çeken) yönü, bilgisayar GPU sürücülerinin, gölgelerinizi ( oyununuz yeterince popüler hale gelirse ) bir gün sessizce belirli GPU için optimize edilmiş özel yeniden yazılmış yazılımlarla değiştirebilecekleridir. Bunu yapmak senin için işe yarıyor.
Bunu, sık sık kıyaslama olarak kullanılan popüler oyunlar için yapacaklar.
Veya oyuncularınıza gölgelendiricilere erişim izni verirseniz, onları kolayca düzenleyebilirler, bazıları kendi yararları için birkaç FPS daha sıkabilir.
Örneğin, Oblivion için, aksi halde zar zor oynanabilen donanımlarda kare hızını çarpıcı şekilde artıracak fan yapımı gölgelendirici ve doku paketleri var.
Ve son olarak, gölgelendiriciniz yeterince karmaşık hale geldiğinde, oyununuz neredeyse bitti ve farklı donanımlar üzerinde test yapmaya başladığınızda, gölgeleyicilerinizi, istemeyeceğiniz çeşitli hatalar nedeniyle, çeşitli GPU'larda çalışacak şekilde sabitlemeye yetecek kadar meşgul olacaksınız. onları bu dereceye kadar optimize etmek için zamana sahip.