Vulkan, sürücülerin uygulamalar için ardışık düzen yeniden kullanımı gibi belirli optimizasyonları gerçekleştirmemesi açısından önceki grafik API'lerinden farklıdır. Bunun yerine, Vulkan kullanan uygulamalar bu optimizasyonları kendilerinin uygulaması gerekir. Aksi takdirde, OpenGL ES'yi çalıştıran uygulamalardan daha kötü performans sergileyebilirler.
Uygulamalar bu optimizasyonları kendileri uyguladığında, belirli bir kullanım alanı için daha spesifik bilgilere erişebildiğinden bunu sürücüden daha başarılı bir şekilde yapma potansiyeline sahip olur. Sonuç olarak, Vulkan kullanan bir uygulamayı ustaca optimize etmek, uygulamanın OpenGL ES'yi kullanmasına kıyasla daha iyi performans sağlayabilir.
Bu sayfada, Android uygulamanızın Vulkan'dan performans artışı elde etmek için uygulayabileceği çeşitli optimizasyonlar tanıtılmaktadır.
Donanım hızlandırma
Çoğu cihaz
Vulkan 1.1'i donanım hızlandırma aracılığıyla desteklerken küçük bir alt grup
Vulkan 1.1'i yazılım emülasyonu aracılığıyla destekler. Uygulamalar, vkGetPhysicalDeviceProperties
kullanarak ve döndürülen yapının deviceType
alanını kontrol ederek yazılım tabanlı bir Vulkan cihazı algılayabilir.
SwiftShader ve diğer CPU tabanlı uygulamalar VK_PHYSICAL_DEVICE_TYPE_CPU
değerine sahiptir.
Uygulamalar, SwiftShader'a özgü değerler için bu aynı yapının vendorID
ve deviceID
alanlarını kontrol ederek özellikle SwiftShader'ı kontrol edebilir.
Performans açısından kritik uygulamalar, yazılım emüleli Vulkan uygulamalarından kaçınmalı ve bunun yerine OpenGL ES'yi kullanmaya başlamalıdır.
Oluşturma sırasında ekran rotasyonunu uygula
Bir uygulamanın yukarı bakan yönü cihaz ekranının yönüyle eşleşmediğinde, düzenleyici, uygulamanın değişim zinciri resimlerini döndürerek uyumlu olmasını sağlar. Resimleri gösterirken bu döndürmeyi gerçekleştirir ve bu da, görüntülerin döndürülmediği duruma kıyasla daha fazla güç tüketimine (bazen önemli ölçüde daha fazla) neden olur.
Buna karşılık, takas zinciri görüntülerini oluştururken bu görüntüleri döndürmek veya çok az ek güç tüketimine neden olur. VkSurfaceCapabilitiesKHR::currentTransform
alanı, birleştiricinin pencereye uyguladığı döndürmeyi gösterir. Bir uygulama, oluşturma sırasında bu rotasyonu uyguladıktan sonra, rotasyonun tamamlandığını bildirmek için VkSwapchainCreateInfoKHR::preTransform
alanını kullanır.
Kare başına oluşturma geçiş sayısını en aza indirin
Çoğu mobil GPU mimarisinde, oluşturma geçişinin başlatılması ve sonlandırılması pahalı bir işlemdir. Uygulamanız, oluşturma işlemlerini mümkün olduğunca az sayıda oluşturma geçişi şeklinde düzenleyerek performansı artırabilir.
Farklı ek yükleme ve ek depolama işlemleri, farklı performans düzeyleri sunar. Örneğin, bir ekin içeriğini korumanız gerekmiyorsa VK_ATTACHMENT_LOAD_OP_LOAD
yerine çok daha hızlı VK_ATTACHMENT_LOAD_OP_CLEAR
veya VK_ATTACHMENT_LOAD_OP_DONT_CARE
kullanabilirsiniz. Benzer şekilde, ekin son değerlerini daha sonra kullanmak üzere belleğe yazmanız gerekmiyorsa VK_ATTACHMENT_STORE_OP_STORE
ile karşılaştırıldığında çok daha iyi bir performans elde etmek için VK_ATTACHMENT_STORE_OP_DONT_CARE
kullanabilirsiniz.
Ayrıca, çoğu oluşturma işleminde, uygulamanızın derinlik/şablon ekini yüklemesi veya depolaması gerekmez. Bu tür durumlarda, ek resmini oluştururken VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
işaretini kullanarak ek için fiziksel bellek ayırmak zorunda kalmazsınız. Bu bit, OpenGL ES'deki glFramebufferDiscard
ile aynı avantajları sağlar.
Uygun bellek türlerini seçin
Uygulamalar, cihaz belleğini ayırırken bir bellek türü seçmelidir. Bellek türü, bir uygulamanın belleği nasıl kullanabileceğini belirler ve ayrıca belleğin önbelleğe alma ve tutarlılık özelliklerini açıklar. Farklı cihazların farklı bellek türleri vardır. Farklı bellek türleri farklı performans özellikleri sergiler.
Uygulamalar, belirli bir kullanım için en iyi bellek türünü seçmek amacıyla basit bir algoritma kullanabilir. Bu algoritma, VkPhysicalDeviceMemoryProperties::memoryTypes
dizisinde şu iki ölçütü karşılayan ilk bellek türünü seçer: Arabellek veya görüntü için bellek türüne izin verilmelidir ve uygulamanın gerektirdiği minimum özelliklere sahip olmalıdır.
Mobil sistemler genellikle CPU ve GPU için ayrı fiziksel bellek yığınlarına sahip olmaz. VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
, bu tür sistemlerde kendi özel belleğine sahip ayrı GPU'lara sahip sistemlerde olduğu kadar önemli değildir. Uygulamalar bu özelliğin zorunlu olduğunu varsaymamalıdır.
Sıklığa göre tanımlayıcı gruplarını gruplandır
Farklı sıklıklarda değişen kaynak bağlamalarınız varsa her çizim için tüm kaynakları yeniden bağlamak yerine ardışık düzen başına birden fazla açıklayıcı kümesi kullanın. Örneğin, sahne başına bağlamalar için bir tanımlayıcı grubunuz, malzeme başına bağlamalar için başka bir tanımlayıcı grubunuz ve örgü örneği başına bağlamalar için üçüncü bir grubunuz olabilir.
Her çekim çağrısında yürütülen değişiklikler gibi en yüksek frekanslı değişiklikler için anlık sabit değerler kullanın.