ข่าวสารผลิตภัณฑ์

การเพิ่มประสิทธิภาพสำหรับ Android XR ด้วย Unity

อ่าน 6 นาที
ดูโปรไฟล์ของ Luke Hopkins
Luke Hopkins วิศวกรนักพัฒนาซอฟต์แวร์สัมพันธ์ของ Android

Samsung Galaxy XR มาแล้ว ขับเคลื่อนโดย Android XR! บล็อกโพสต์นี้เป็นส่วนหนึ่งของ สัปดาห์แนะนำ Android XR ซึ่งเราจะจัดหาแหล่งข้อมูลต่างๆ ไม่ว่าจะเป็นบล็อกโพสต์ วิดีโอ โค้ดตัวอย่าง และอื่นๆ อีกมากมาย ซึ่งทั้งหมดนี้ออกแบบมาเพื่อช่วยให้คุณได้เรียนรู้ สร้าง และเตรียมแอปสำหรับ Android XR  

สัปดาห์นี้ Samsung ได้เปิดตัว Galaxy XR ซึ่งสร้างขึ้นโดยความร่วมมือกับ Google และ Qualcomm นี่เป็นช่วงเวลาที่น่าตื่นเต้นสำหรับนักพัฒนาแอป และเราต้องการช่วยให้คุณได้รับประสิทธิภาพที่ดีที่สุดจากแอป XR

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

ในคู่มือนี้ เราจะอธิบายการเพิ่มประสิทธิภาพที่สำคัญซึ่งคุณต้องทำความเข้าใจสำหรับการพัฒนา Android XR คุณจะได้ทราบว่าฟีเจอร์ใดที่ช่วยเพิ่มประสิทธิภาพได้มากที่สุด ควรใช้เมื่อใด และฟีเจอร์ต่างๆ ทำงานร่วมกันอย่างไรเพื่อช่วยให้คุณบรรลุเป้าหมายอัตราเฟรม

เป้าหมายของเรามีดังนี้ 

  • ขั้นต่ำ: 72fps (ส่วนหนึ่งของหลักเกณฑ์ด้านคุณภาพการเล่น)
  • ไม่บังคับ: 90 FPS โดยมีงบประมาณ 11 มิลลิวินาทีต่อเฟรม

ดูข้อมูลเพิ่มเติมเกี่ยวกับเหตุผลที่ควรคงอัตราเฟรมสูงเช่นนี้ได้ที่หลักเกณฑ์ด้านประสิทธิภาพ   

ฟีเจอร์ด้านประสิทธิภาพเฉพาะ XR

เราจะเริ่มด้วยการพูดถึงฟีเจอร์ด้านประสิทธิภาพ 2 อย่างที่เฉพาะเจาะจงสำหรับ XR ได้แก่ Foveated Rendering และ Vulkan Subsampling 

การแสดงผลแบบโฟเวต

การเรนเดอร์แบบโฟเวตคือการเพิ่มประสิทธิภาพที่มี 2 โหมด โหมดแรกคือโหมดคงที่ ซึ่งแสดงผลตรงกลางหน้าจอที่ความละเอียดสูงขึ้น และค่อยๆ ลดความละเอียดลงเมื่อมองออกไปด้านนอก

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

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

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

การสุ่มย่อย Vulkan

การสุ่มตัวอย่างย่อยของ Vulkan คือเพื่อนซี้ของการเรนเดอร์แบบโฟเวต ในขณะที่การเรนเดอร์แบบโฟเวตจะกำหนดสิ่งที่ต้องเรนเดอร์ในระดับคุณภาพต่างๆ Vulkan Subsampling จะจัดการวิธีเรนเดอร์ระดับคุณภาพต่างๆ อย่างมีประสิทธิภาพโดยใช้แผนที่ความหนาแน่นของ Fragment

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

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

ฟีเจอร์ GPU สำหรับฉากที่ซับซ้อน

นอกจาก Foveated Rendering และ Vulkan Subsampling แล้ว ยังมีฟีเจอร์ GPU บางอย่างที่ช่วยลดภาระที่ไม่จำเป็นผ่านการสร้างอินสแตนซ์และการคัดกรองอัจฉริยะ ซึ่งมีประสิทธิภาพอย่างยิ่งสำหรับฉากที่ซับซ้อนซึ่งมีรูปทรงซ้ำๆ หรือมีการบดบังอย่างมาก

ลิ้นชักที่อยู่ใน GPU

GPU Resident Drawer จะใช้การสร้างอินสแตนซ์ GPU โดยอัตโนมัติเพื่อลดการเรียกวาดและเพิ่มเวลาในการประมวลผลของ CPU ดังนั้นแทนที่ CPU จะบอก GPU เกี่ยวกับออบเจ็กต์แต่ละรายการแยกกัน GPU จะจัดกลุ่มออบเจ็กต์ที่คล้ายกันไว้ด้วยกัน

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

ลองนึกภาพฉากป่าที่มีต้นไม้ 200 ต้นโดยใช้ตาข่ายฐานเดียวกัน หากไม่มี GPU Resident Drawer คุณจะมีคำสั่งวาด 200 รายการที่ใช้ GPU ซึ่งจะทำให้ CPU ว่าง เมื่อเปิดใช้ฟีเจอร์นี้ GPU จะสร้างอินสแตนซ์ของต้นไม้เหล่านั้นอย่างชาญฉลาด ซึ่งจะช่วยลดจำนวนการเรียกวาดเหลือเพียง 5-10 ครั้ง ซึ่งจะช่วยประหยัด GPU ได้อย่างมาก จากนั้นคุณสามารถนำไปใช้กับตรรกะการเล่นเกมหรือการคำนวณฟิสิกส์ได้

การคัดกรองการบดบังด้วย GPU

การคัดกรองการบดบังด้วย GPU จะใช้ GPU แทน CPU เพื่อระบุและข้ามการแสดงผลออบเจ็กต์ที่ซ่อนอยู่ โดยจะตรวจหาวัตถุที่ถูกบดบัง (ซ่อน) อยู่ด้านหลังวัตถุอื่นๆ โดยอัตโนมัติ เพื่อไม่ให้ GPU ทำงานกับสิ่งที่ผู้ใช้มองไม่เห็น

ฟีเจอร์นี้มีประสิทธิภาพเป็นพิเศษในพื้นที่ภายในที่มีหลายห้อง สภาพแวดล้อมหนาแน่น หรือฉากสถาปัตยกรรมที่ผนัง พื้น และวัตถุต่างๆ บดบังมุมมองตามธรรมชาติ

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

การตรวจสอบประสิทธิภาพ

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

Performance Metrics API

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

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

ก่อนที่จะเปิดใช้การแสดงผลแบบโฟเวต เวลาที่ใช้ในการแสดงผลเฟรมของ GPU อาจอยู่ที่ 13 มิลลิวินาที ซึ่งเกินงบประมาณ 11 มิลลิวินาที เปิดใช้การเรนเดอร์แบบโฟเวต วัดอีกครั้ง และหวังว่าคุณจะเห็นว่าเวลาในการประมวลผลลดลงเหลือ 9 มิลลิวินาที ซึ่งเป็นส่วนต่าง 4 มิลลิวินาทีที่คุณได้รับเพื่อเพิ่มรายละเอียดให้กับฉาก ปรับปรุงคุณภาพภาพในส่วนอื่นๆ หรือเพียงแค่ทำให้ประสิทธิภาพราบรื่นยิ่งขึ้นในเนื้อหาที่หลากหลาย

หากไม่มีเมตริกเหล่านี้ คุณก็เพิ่มประสิทธิภาพโดยไม่รู้ทิศทาง Performance Metrics API จะบอกความจริงเกี่ยวกับสิ่งที่ช่วยให้ Use Case เฉพาะของคุณประสบความสำเร็จ

โปรแกรมแก้ไขข้อบกพร่องของเฟรม

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

หากต้องการยืนยันว่า SRP Batcher ทำงานอยู่ ให้ทำดังนี้ มองหารายการ "RenderLoopNewBatcher" ในเครื่องมือแก้ไขข้อบกพร่องของเฟรม กำลังตรวจสอบว่า GPU Resident Drawer จัดกลุ่มอย่างถูกต้องหรือไม่ มองหารายการ "กลุ่มงานแบบไฮบริด" การยืนยันด้วยภาพเหล่านี้ช่วยให้คุณเข้าใจว่าการตั้งค่าการเพิ่มประสิทธิภาพมีผลจริงหรือไม่

ดูขั้นตอนการเรียกใช้การวาด 50 ครั้งแรกของฉาก หากเห็นว่ามีการวาดออบเจ็กต์ที่คล้ายกันทีละรายการแทนที่จะเป็นแบบกลุ่ม แสดงว่าการสร้างอินสแตนซ์หรือการจัดกลุ่มของคุณทำงานไม่ถูกต้อง Frame Debugger จะแสดงปัญหาเหล่านี้ทันทีเพื่อให้คุณแก้ไขได้

การเพิ่มประสิทธิภาพเพิ่มเติม

นอกจากการเพิ่มประสิทธิภาพที่เรากล่าวถึงข้างต้นแล้ว คู่มือประสิทธิภาพฉบับเต็มยังครอบคลุมการเพิ่มประสิทธิภาพอื่นๆ อีกด้วย สรุปสั้นๆ มีดังนี้

  • การตั้งค่า URP: ปิดใช้ HDR และการประมวลผลภายหลังสำหรับ XR บนอุปกรณ์เคลื่อนที่ ฟีเจอร์เหล่านี้มีผลกระทบต่อภาพน้อยที่สุดเมื่อเทียบกับต้นทุนด้านประสิทธิภาพในฮาร์ดแวร์ของอุปกรณ์เคลื่อนที่ คุณจึงจะได้รับประสิทธิภาพที่วัดผลได้โดยมีความแตกต่างด้านภาพที่แทบมองไม่เห็น
  • SRP Batcher: ลดค่าใช้จ่ายของ CPU สำหรับฉากที่มีวัสดุจำนวนมากซึ่งใช้ตัวแปร Shader เดียวกัน การลดการเปลี่ยนแปลงสถานะการแสดงผลระหว่างการเรียกการวาดจะช่วยลดเวลา CPU ที่ใช้ในการแสดงผลได้อย่างมาก
  • อัตราการรีเฟรชจอแสดงผล: ปรับแบบไดนามิกระหว่าง 72 FPS ถึง 90 FPS ตามความซับซ้อนของฉาก ลดอัตราเฟรมในฉากที่ซับซ้อนเพื่อรักษาความเสถียร แล้วเพิ่มอัตราเฟรมในฉากที่เรียบง่ายเพื่อการโต้ตอบที่ราบรื่นเป็นพิเศษ
  • พื้นผิวแบบลึก/ทึบ: ปิดใช้เว้นแต่จำเป็นสำหรับเอฟเฟกต์ Shader ซึ่งทำให้เกิดการคัดลอก GPU ที่ไม่จำเป็นซึ่งทำให้ประสิทธิภาพลดลงโดยไม่เป็นประโยชน์ต่อแอปพลิเคชันส่วนใหญ่
  • สเกลการแสดงผล URP: การตั้งค่านี้ช่วยให้คุณแสดงผลที่ความละเอียดต่ำลงเพื่อเพิ่มประสิทธิภาพ หรือเพิ่มสเกลการแสดงผลเพื่อปรับปรุงคุณภาพภาพ

ดูวิธีการเพิ่มประสิทธิภาพเหล่านี้และอื่นๆ แบบทีละขั้นตอนได้ในคู่มือประสิทธิภาพ Unity ฉบับสมบูรณ์สำหรับ Android XR

บทสรุป

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

แผนกลยุทธ์ของคุณมีดังนี้

  1. เริ่มต้นด้วย Foveated Rendering และ Vulkan Subsampling ฟีเจอร์เฉพาะ XR เหล่านี้ช่วยประหยัด GPU ได้ทันทีและเห็นผลชัดเจน
  2. เพิ่ม GPU Resident Drawer และ Occlusion Culling หากมีฉากที่ซับซ้อนซึ่งมีรูปทรงซ้ำหรือพื้นที่ภายใน
  3. ตรวจสอบทุกอย่างด้วย Performance Metrics API เพื่อให้มั่นใจว่าการเปลี่ยนแปลงของคุณช่วยได้จริง
  4. สํารวจการเพิ่มประสิทธิภาพ URP เพิ่มเติมเพื่อเพิ่มช่องว่างด้านประสิทธิภาพ

การวัดผลอย่างต่อเนื่องและการทำซ้ำเป็นสิ่งสำคัญ การเพิ่มประสิทธิภาพบางอย่างอาจไม่ได้เป็นประโยชน์ต่อทุกโปรเจ็กต์อย่างเท่าเทียมกัน ดังนั้นให้ใช้ Performance Metrics API เพื่อให้ทราบอย่างชัดเจนว่าสิ่งใดที่ช่วยกรณีการใช้งานของคุณโดยเฉพาะ

ขั้นตอนต่อไป: พัฒนาทักษะของคุณ

พร้อมเจาะลึกแล้วหรือยัง ลองดูแหล่งข้อมูลเหล่านี้

  • คำแนะนำด้านประสิทธิภาพของ Unity สำหรับ Android XR - วิธีการติดตั้งใช้งานแบบทีละขั้นตอนที่สมบูรณ์สำหรับฟีเจอร์ทั้งหมดที่กล่าวถึงที่นี่
  • เริ่มต้นใช้งาน Unity และ Android XR - ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์และ เริ่มสร้าง
  • เอกสารประกอบสำหรับนักพัฒนา Android XR - คำแนะนำที่ครอบคลุมสำหรับฟีเจอร์ทั้งหมดของ Android XR
เขียนโดย
อ่านต่อ