ย้ายข้อมูลสคริปต์ไปยัง Vulkan

สำหรับเวิร์กโหลดที่การประมวลผลด้วย GPU เหมาะที่สุด การย้ายข้อมูลสคริปต์ RenderScript ไปยังการประมวลผลด้วย Vulkan จะช่วยให้แอปควบคุมฮาร์ดแวร์ GPU ได้โดยตรงมากขึ้น ซึ่งอาจช่วยเพิ่มประสิทธิภาพได้เมื่อเทียบกับ API อื่นๆ

ภาพรวมระดับสูงต่อไปนี้จะช่วยคุณใช้ Shader แบบประมวลผลของ Vulkan เพื่อแทนที่สคริปต์ RenderScript

การเริ่มต้น Vulkan

แทนที่จะสร้างออบเจ็กต์บริบท RenderScript ใน Kotlin หรือ Java ให้ทำตามขั้นตอนต่อไปนี้เพื่อสร้างบริบท Vulkan โดยใช้ NDK

  1. สร้างอินสแตนซ์ Vulkan

  2. เลือกอุปกรณ์จริง Vulkan ที่รองรับคิวการประมวลผล

  3. สร้างอุปกรณ์เชิงตรรกะ Vulkan และรับคิวการประมวลผล

คุณอาจตั้งค่าเลเยอร์การตรวจสอบ Vulkan ใน Android เพื่อเร่งการพัฒนาแอปพลิเคชัน Vulkan

แอปตัวอย่างจะสาธิตวิธีเริ่มต้นบริบท Vulkan ใน VulkanContext.h ดูข้อมูลเพิ่มเติมได้ที่ส่วนการเริ่มต้นและอุปกรณ์และคิวของข้อกำหนด Vulkan

การจัดสรร Vulkan

คุณสามารถย้ายข้อมูลการจัดสรร RenderScript ไปยังรูปภาพพื้นที่เก็บข้อมูล Vulkan หรือบัฟเฟอร์พื้นที่เก็บข้อมูล Vulkan หากต้องการให้รูปภาพแบบอ่านอย่างเดียวมีประสิทธิภาพดีขึ้น ให้ใช้รูปภาพที่สุ่มตัวอย่างกับการดำเนินการดึงข้อมูล ไม่ว่าจะใช้เป็นเครื่องมือเลือกภาพแบบรวม หรือใช้การเชื่อมโยงเครื่องมือเลือกและรูปภาพที่สุ่มตัวอย่างแยกกัน

ระบบจะจัดสรรทรัพยากร Vulkan ภายใน Vulkan หากต้องการหลีกเลี่ยงค่าใช้จ่ายเพิ่มเติมในการคัดลอกหน่วยความจำเมื่อโต้ตอบกับคอมโพเนนต์อื่นๆ ของ Android ให้พิจารณาใช้ส่วนขยาย VK_ANDROID_external_memory_android_hardware_buffer เพื่อนำเข้า AHardwareBuffer ของ Android ไปยัง Vulkan ส่วนขยายนี้พร้อมใช้งานในอุปกรณ์ Android ทั้งหมดที่รองรับ Vulkan 1.1 ดูข้อมูลเพิ่มเติมได้ที่ FEATURE_VULKAN_HARDWARE_VERSION

แอปตัวอย่างแสดงวิธีสร้างทรัพยากร Vulkan ใน VulkanResources.h ดูข้อมูลเพิ่มเติมได้ที่ส่วนการสร้างทรัพยากรและตัวระบุทรัพยากรของข้อกำหนด Vulkan

การแปลงเป็นเชดเดอร์การประมวลผลของ Vulkan

สคริปต์ RenderScript ต้องแปลงเป็น Shader การประมวลผลของ Vulkan นอกจากนี้ คุณยังอาจต้องปรับเปลี่ยนโค้ดโดยขึ้นอยู่กับการใช้ตัวแปรส่วนกลางของ RenderScript ด้วย

เขียน Shader การคำนวณของ Vulkan

โดยทั่วไป เชดเดอร์การประมวลผลของ Vulkan จะเขียนด้วยภาษาการจัดแสง OpenGL (GLSL) จากนั้นจะคอมไพล์เป็นรูปแบบ Standard Portable Intermediate Representation-V (SPIR-V)

ดูข้อมูลโดยละเอียดและวิธีการผสานรวมโปรแกรมเปลี่ยนสีลงในแอปได้ที่คอมไพเลอร์โปรแกรมเปลี่ยนสี Vulkan ใน Android

การปรับเปลี่ยนตัวแปรส่วนกลางของสคริปต์

เราขอแนะนําให้ใช้ค่าคงที่เฉพาะ PUSH_CONSTANT หรือออบเจ็กต์บัฟเฟอร์แบบคงที่สำหรับตัวแปรส่วนกลางที่ไม่ได้แก้ไขภายในโปรแกรมเปลี่ยนรูปแบบตามข้อกำหนดต่อไปนี้ตามลักษณะของตัวแปรส่วนกลางของสคริปต์

  • ค่าคงที่เฉพาะ: แนะนําสําหรับตัวแปรส่วนกลางของสคริปต์ที่มีความสอดคล้องกันส่วนใหญ่ในคําเรียกใช้เคอร์เนล การเปลี่ยนค่าของค่าคงที่เฉพาะทางจะต้องสร้างไปป์ไลน์การประมวลผลขึ้นมาใหม่
  • Push constants: แนะนําสําหรับตัวแปรส่วนกลางของสคริปต์ที่มีการเปลี่ยนแปลงบ่อยซึ่งมีขนาดเล็กกว่า maxPushConstantsSize (รับประกันขั้นต่ำ 128 ไบต์)
  • บัฟเฟอร์แบบสอดคล้อง: แนะนำให้ใช้กับตัวแปรส่วนกลางของสคริปต์ที่มีการเปลี่ยนแปลงบ่อยซึ่งมีขนาดใหญ่กว่าขีดจำกัดของค่าคงที่แบบ Push

สำหรับตัวแปรส่วนกลางที่มีการเปลี่ยนแปลงภายในโปรแกรมเปลี่ยนสี คุณสามารถใช้รูปภาพพื้นที่เก็บข้อมูล Vulkan หรือบัฟเฟอร์พื้นที่เก็บข้อมูล Vulkan

การคํานวณ

คุณต้องสร้างไปป์ไลน์การประมวลผลของ Vulkan เพื่อให้ GPU เรียกใช้คอมพิวตเชดเดอร์

สร้างไปป์ไลน์การประมวลผล Vulkan

ไฟล์ ComputePipeline.h ในแอปตัวอย่างแสดงวิธีสร้างไปป์ไลน์การประมวลผล Vulkan

หากต้องการใช้โปรแกรมเปลี่ยนรูปแบบ SPIR-V ที่คอมไพล์แล้วใน Vulkan ให้สร้างไปป์ไลน์การประมวลผล Vulkan ดังนี้

  1. สร้างโมดูล Shader ด้วย Shader SPIR-V ที่คอมไพล์แล้ว
  2. สร้างเลย์เอาต์ชุดตัวระบุที่ระบุการเชื่อมโยงทรัพยากร (ดูรายละเอียดเพิ่มเติมที่การจัดสรร)
  3. สร้างชุดตัวระบุจากเลย์เอาต์ชุดตัวระบุ
  4. สร้างเลย์เอาต์ไปป์ไลน์จากเลย์เอาต์ชุดตัวระบุ
  5. สร้างไปป์ไลน์การประมวลผลด้วยโมดูล Shader และเลย์เอาต์ไปป์ไลน์

ดูข้อมูลเพิ่มเติมได้ที่ส่วนไปป์ไลน์การประมวลผลในข้อมูลจำเพาะของ Vulkan

เริ่มการคํานวณ

วิธีเริ่มการคํานวณด้วยไปป์ไลน์การประมวลผล

  1. อัปเดตชุดตัวระบุด้วยทรัพยากร Vulkan
  2. สร้างบัฟเฟอร์คำสั่ง Vulkan และบันทึกคำสั่งต่อไปนี้
    1. เชื่อมโยงไปป์ไลน์และชุดตัวระบุ
    2. ส่งกลุ่มงานประมวลผล
  3. ส่งบัฟเฟอร์คําสั่งไปยังคิวการประมวลผล
  4. รอในคิว หรือจะแสดงเขตการซิงค์ก็ได้

หากต้องการต่อเชื่อมเคอร์เนลหลายรายการเข้าด้วยกัน (เช่น เพื่อย้ายข้อมูลโค้ดโดยใช้ ScriptGroup) ให้บันทึกไว้ในบัฟเฟอร์คำสั่งเดียวและซิงค์กับบัวเรียมหน่วยความจำ

แอปตัวอย่างจะแสดงงานประมวลผล 2 รายการดังนี้

  • การหมุน HUE: งานประมวลผลแบบง่ายที่มีเชดเดอร์การประมวลผลเพียงรายการเดียว ดูตัวอย่างโค้ดได้ที่ ImageProcessor::rotateHue
  • เบลอ: งานประมวลผลที่ซับซ้อนมากขึ้นซึ่งจะเรียกใช้คอมพิวต shader 2 รายการตามลำดับ ดูตัวอย่างโค้ดได้ที่ ImageProcessor::blur

ดูข้อมูลเพิ่มเติมเกี่ยวกับบัฟเฟอร์คําสั่งหรือบัวแรร์หน่วยความจําได้ที่ส่วนต่างๆ ในข้อกําหนดของ Vulkan ซึ่งเรียกว่าบัฟเฟอร์คําสั่งและบัวแรร์หน่วยความจํา