Bazen vektör grafikleri kullanıyorum, çünkü bazı durumlarda biraz daha güzel görünüyorlar , diğer zamanlarda bitmap / raster grafikleri kullanıyorum.
Merak ediyordum, bu iki seçenek arasında önemli performans farklılıkları var mı?
Bazen vektör grafikleri kullanıyorum, çünkü bazı durumlarda biraz daha güzel görünüyorlar , diğer zamanlarda bitmap / raster grafikleri kullanıyorum.
Merak ediyordum, bu iki seçenek arasında önemli performans farklılıkları var mı?
Yanıtlar:
TheBuzzSaw'ın dediği gibi, rasterleştirilmiş grafiklerin vektör grafiklere karşı uygulamaları da dahil olmak üzere birçok şeye bağlıdır.
Geleneksel rasterleştirme yöntemleri kullanılarak oluşturulan bazı yüksek performanslı vektör grafik yöntemleri.
Döngü ve Blinn, tek bir üçgen oluşturarak ve bir pikselin eğrinin üstünde mi altında mı olduğunu söylemek için bir piksel gölgeleyicisinde doku koordinatlarını kullanarak vektör grafiklerinin ikinci dereceden çerçeve eğrisinin nasıl oluşturulacağını gösterir: http: //www.msr-waypoint. net / en-us / um / insanlar / cloop / LoopBlinn05.pdf
Temel fikir, üçgen köşe konumlarınızı 3 kontrol noktası konumu ve her köşedeki doku koordinatlarını sırasıyla (0,0), (0,5,0) ve (1,1) olarak ayarlamanızdır. Gölgelendiricinizde, enterpolasyonlu doku koordinatı (x * xy) <0 ise, piksel eğrinin altındadır, aksi takdirde eğrinin üzerindedir.
Shadertoy'da bunun sahte bir uygulamasını burada görebilirsiniz: https://www.shadertoy.com/view/4tj3Dy
İkinci yönteme gelince, burada, bir şekle olan mesafelerin piksel verileri yerine bir dokuda saklandığı ve vektör örneklerinin doku örneklemesi kullanılarak çizilmesine izin veren bir yöntem. Kod çözme çok basittir, sadece bir alfa testi kullanılarak sabit işlevli donanımlarda bile uygulanabilir! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf
İkinci tekniğin ne kadar iyi çalıştığı hakkında bir fikir vermek için, bu 1024x768 bıyık görüntüsü, tek bir renk kanalı olan 64x32 kaynak görüntüden oluşturuldu! (diğer adıyla 2 KB sıkıştırılmamış)
Bu konuda blogumda da bazı şeyler yazdım: http://blog.demofox.org/2014/06/30/distance-field-textures/
Ne kadar basit olduğunu göstermek için bazı örnek OpenCL kodu:
float alpha = read_imagef(tex3dIn, g_textureSampler, textureCoords).w;
float3 color = (alpha < 0.5f) ? (float3)(1.0f) : (float3)(0.0f);
Bu tekniklerin her ikisi de süper hızlıdır ve vektör ile rasterleştirilmiş grafikler arasındaki çizgiyi biraz bulanıklaştırır. Rasterleştirme teknikleri kullanılarak oluşturulurlar, ancak vektör grafik teknikleri gibi yakınlaştırma / ölçeklendirme özelliklerine sahiptirler.
Olabilir.
Daha az teknik cevap:
Grafik programlama ile ilgisi olmayan bir web sitesi veya başka bir uygulama oluşturuyorsanız, cevap muhtemelen evettir. Temel API'ler nasıl oluşturulacağını tahmin etmeye ve verimli bir şekilde önbelleğe almaya çalışır. Ancak, uygulamanız çalıştığında ve API bazen yanlış tahmin ettiğinden, bazı şeyleri yeniden oluşturması ve performansı etkilemesi gerekebilir.
Daha teknik:
En yeni GPU'lardan birini ve GPU'daki vektör yollarını çizmek için bir kütüphane kullanmadığınız sürece, tümünün GPU tarafından oluşturulan bitmap dokular olduğunu unutmayın.
Vektör grafiklerinin dokulara dönüştürüldüğü tipik durumu ele alacağım. Burada performans, araç zincirinize, uygulamanızın vektör varlıklarından dinamik olarak doku oluşturup oluşturmadığına ve grafiklerin çeşitli yakınlaştırma düzeylerinde görüntülenip görüntülenmediğine bağlıdır. İki sorun vardır: kaynaklar ve doku üretimi. Grafikleri yalnızca statik boyutta görüntülüyorsanız, fark olmadığını ve belki de araç zincirinizin çalışma zamanından önce varlıkları bitmap grafiklerine dönüştürebileceğini söyleyebilirim. Ancak, çeşitli boyutlarda veya 3D bir dünyada gösteriliyorsa, daha fazla bellek alan mip eşlemeli dokulara ihtiyacınız olacak. Eğer sadakatlerini daha büyük bir doku ile 'yakından' görmek istiyorsanız, çok fazla hafıza alacaklar.
Umarım bu yardımcı olur.
Vektör grafikleri oluşturmanın birkaç yolu vardır. TheBuzzSaw'ın belirttiği gibi, NVIDIA genel yolları oldukça hızlı bir şekilde oluşturabilen bir uzantıya sahiptir (ancak elbette sadece NVIDIA GPU'larda çalışır). Ve Alan Wolfe, bir şeklin içinde mi yoksa dışında mı olduğunu söyleyen bir işlevi tanımlayan ve bu işleve göre pikselleri renklendiren örtük yüzey yöntemlerinden (Döngü-Yanıp Sönme / mesafe alanları) bahseder. Başka bir yöntem, şablonu bir şablon arabelleğine dönüştürdüğünüz ve yolun bir pikseli kapsayıp kapsamadığını belirlemek için çift-tek sayımı kullandığınız şablon-ve-kapak yöntemidir.
Bununla birlikte, genel olarak, ödünç verme, raster oluşturma işleminin daha hızlı olacağı, ancak takma işlemine daha duyarlı olacağıdır (mesafe alanları düşük ve yüksek ölçeklerde bile parçalanır). Oluşturma yolları çok fazla kurulum gerektirir, ancak teoride herhangi bir çözüme ölçeklendirilebilir.