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

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

ใช้เวลาอ่าน 6 นาที
Luke Hopkins
วิศวกรนักพัฒนาซอฟต์แวร์สัมพันธ์ของ Android

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

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

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

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

สิ่งที่เรามุ่งมั่นที่จะทำมีดังนี้ 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

นอกจากการแสดงผลแบบโฟเวตและการสุ่มตัวอย่างย่อย Vulkan แล้ว ยังมีฟีเจอร์ 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 จะข้ามการแสดงผลวัตถุที่ซ่อนอยู่โดยอัตโนมัติ ซึ่งจะช่วยให้คุณมีงบประมาณด้านประสิทธิภาพมากขึ้นสำหรับสิ่งที่มองเห็นได้จริง

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

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

Performance Metrics API

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

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

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

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

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

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

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

ดูการเรียกใช้การวาด 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 ฟีเจอร์เฉพาะ 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
เขียนโดย

อ่านต่อ