Vulkan แตกต่างจาก API กราฟิกก่อนหน้านี้ตรงที่ไดรเวอร์ไม่ได้ทำการเพิ่มประสิทธิภาพบางอย่าง เช่น การนำไปป์ไลน์กลับมาใช้ซ้ำ สำหรับแอป แต่แอปที่ใช้ Vulkan จะต้อง ใช้การเพิ่มประสิทธิภาพดังกล่าวด้วยตนเอง หากไม่เป็นเช่นนั้น แอปอาจมีประสิทธิภาพแย่กว่าแอปที่ใช้ OpenGL ES
เมื่อแอปใช้การเพิ่มประสิทธิภาพเหล่านี้ด้วยตนเอง แอปก็มีศักยภาพ ที่จะทำได้สำเร็จมากกว่าคนขับ เนื่องจากแอปมีสิทธิ์เข้าถึง ข้อมูลที่เฉพาะเจาะจงมากขึ้นสำหรับกรณีการใช้งานที่กำหนด ด้วยเหตุนี้ การเพิ่มประสิทธิภาพแอปที่ใช้ Vulkan อย่างชำนาญจึงอาจให้ประสิทธิภาพที่ดีกว่าในกรณีที่แอปใช้ OpenGL ES
หน้านี้จะแนะนำการเพิ่มประสิทธิภาพหลายอย่างที่แอป Android สามารถนำไปใช้เพื่อเพิ่มประสิทธิภาพจาก Vulkan
การเร่งฮาร์ดแวร์
อุปกรณ์ส่วนใหญ่
รองรับ Vulkan 1.1 ผ่านการเร่งด้วยฮาร์ดแวร์ ขณะที่อุปกรณ์บางส่วนรองรับ
ผ่านการจำลองซอฟต์แวร์ แอปสามารถตรวจหาอุปกรณ์ Vulkan ที่ใช้ซอฟต์แวร์ได้โดยใช้ vkGetPhysicalDeviceProperties
และตรวจสอบฟิลด์ deviceType ของโครงสร้างที่ส่งคืน
SwiftShader และการใช้งานอื่นๆ ที่อิงตาม CPU มีค่าเป็น VK_PHYSICAL_DEVICE_TYPE_CPU
แอปสามารถตรวจสอบ SwiftShader โดยเฉพาะได้โดยการตรวจสอบฟิลด์ vendorID และ deviceID
ของโครงสร้างเดียวกันนี้เพื่อดูค่าเฉพาะของ SwiftShader
แอปที่สำคัญต่อประสิทธิภาพควรหลีกเลี่ยงการใช้การติดตั้งใช้งาน Vulkan ที่จำลองด้วยซอฟต์แวร์ และกลับไปใช้ OpenGL ES แทน
ใช้การหมุนจอแสดงผลระหว่างการแสดงผล
เมื่อทิศทางที่หันขึ้นของแอปไม่ตรงกับการวางแนวของจอแสดงผลของอุปกรณ์ คอมโพสิเตอร์จะหมุนรูปภาพใน Swapchain ของแอปเพื่อให้ตรงกัน โดยจะหมุนรูปภาพขณะแสดง ซึ่งส่งผลให้ใช้พลังงานมากกว่าในกรณีที่ไม่ได้หมุนรูปภาพ
ในทางตรงกันข้าม การหมุนรูปภาพใน Swapchain ขณะสร้างจะทำให้มีการใช้พลังงานเพิ่มเติมเพียงเล็กน้อย (หากมี) ฟิลด์
VkSurfaceCapabilitiesKHR::currentTransform ระบุการหมุน
ที่คอมโพสิตเตอร์ใช้กับหน้าต่าง หลังจากที่แอปใช้การหมุนนั้น
ในระหว่างการแสดงผลแล้ว แอปจะใช้ฟิลด์ VkSwapchainCreateInfoKHR::preTransform
เพื่อรายงานว่าการหมุนเสร็จสมบูรณ์แล้ว
ลดจำนวนการแสดงผลต่อเฟรม
ในสถาปัตยกรรม GPU ของอุปกรณ์เคลื่อนที่ส่วนใหญ่ การเริ่มต้นและสิ้นสุดการส่งผ่านการแสดงผลเป็น การดำเนินการที่มีค่าใช้จ่ายสูง แอปสามารถปรับปรุงประสิทธิภาพได้โดยจัดระเบียบการดำเนินการแสดงผลให้มี การส่งผ่านการแสดงผลน้อยที่สุด
การดำเนินการโหลดไฟล์แนบและการจัดเก็บไฟล์แนบที่แตกต่างกันจะให้ประสิทธิภาพในระดับที่แตกต่างกัน
เช่น หากไม่จำเป็นต้องเก็บเนื้อหาของไฟล์แนบ คุณสามารถใช้ VK_ATTACHMENT_LOAD_OP_CLEAR หรือ VK_ATTACHMENT_LOAD_OP_DONT_CARE ซึ่งเร็วกว่ามากแทน VK_ATTACHMENT_LOAD_OP_LOAD ได้ ในทำนองเดียวกัน หากไม่จำเป็นต้องเขียนค่าสุดท้ายของไฟล์แนบลงในหน่วยความจำเพื่อใช้ในภายหลัง คุณสามารถใช้ VK_ATTACHMENT_STORE_OP_DONT_CARE เพื่อให้ได้ประสิทธิภาพที่ดีกว่า VK_ATTACHMENT_STORE_OP_STORE มาก
นอกจากนี้ ในการส่งผ่านการแสดงผลส่วนใหญ่ แอปไม่จำเป็นต้องโหลดหรือจัดเก็บไฟล์แนบความลึก/ลายฉลุ
ในกรณีดังกล่าว คุณสามารถหลีกเลี่ยงการจัดสรรหน่วยความจำจริงสำหรับไฟล์แนบได้โดยใช้แฟล็ก VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
เมื่อสร้างรูปภาพไฟล์แนบ บิตนี้ให้ประโยชน์เช่นเดียวกับ
glFramebufferDiscard ใน OpenGL ES
เลือกประเภทหน่วยความจำที่เหมาะสม
เมื่อจัดสรรหน่วยความจำของอุปกรณ์ แอปต้องเลือกประเภทหน่วยความจำ ประเภทหน่วยความจำ กำหนดวิธีที่แอปใช้หน่วยความจำ รวมถึงอธิบายแคชและ พร็อพเพอร์ตี้ความสอดคล้องของหน่วยความจำ อุปกรณ์แต่ละเครื่องมีหน่วยความจำ ประเภทต่างๆ และหน่วยความจำแต่ละประเภทก็มีลักษณะประสิทธิภาพ ที่แตกต่างกัน
แอปสามารถใช้อัลกอริทึมอย่างง่ายเพื่อเลือกประเภทหน่วยความจำที่ดีที่สุดสำหรับ
การใช้งานที่กำหนด อัลกอริทึมนี้จะเลือกประเภทความทรงจำแรกในอาร์เรย์ VkPhysicalDeviceMemoryProperties::memoryTypes ที่ตรงตามเกณฑ์ 2 ข้อต่อไปนี้
ต้องอนุญาตให้ใช้ประเภทความทรงจำสำหรับบัฟเฟอร์
หรือรูปภาพ และต้องมีพร็อพเพอร์ตี้ขั้นต่ำที่แอปต้องการ
โดยทั่วไปแล้ว ระบบบนอุปกรณ์เคลื่อนที่จะไม่มีฮีปหน่วยความจำจริงแยกต่างหากสำหรับ CPU และ GPU ในระบบดังกล่าว VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT จะไม่สำคัญเท่ากับในระบบที่มี GPU แยกต่างหากพร้อมหน่วยความจำเฉพาะของตัวเอง แอปไม่ควรคิดว่าต้องใช้พร็อพเพอร์ตี้นี้
จัดกลุ่มชุดตัวอธิบายตามความถี่
หากมีการเชื่อมโยงทรัพยากรที่เปลี่ยนแปลงด้วยความถี่ที่แตกต่างกัน ให้ใช้ชุดตัวอธิบายหลายชุดต่อไปป์ไลน์แทนการเชื่อมโยงทรัพยากรทั้งหมดใหม่สำหรับการวาดแต่ละครั้ง เช่น คุณอาจมีชุดตัวอธิบายชุดหนึ่งสําหรับการเชื่อมโยงต่อฉาก ชุดที่ 2 สําหรับการเชื่อมโยงต่อวัสดุ และชุดที่ 3 สําหรับ การเชื่อมโยงต่ออินสแตนซ์ของตาข่าย
ใช้ค่าคงที่แบบทันทีสำหรับการเปลี่ยนแปลงที่มีความถี่สูงสุด เช่น การเปลี่ยนแปลง ที่ดำเนินการกับการเรียกการวาดแต่ละครั้ง