วัสดุและ Shader

ทําตามแนวทางปฏิบัติแนะนําเหล่านี้เพื่อเพิ่มประสิทธิภาพการใช้วัสดุและ Shader ในเกม Android

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

เนื้อหาบางส่วนของบทความนี้อิงตามผลงานที่ Arm Limited เป็นผู้มีส่วนร่วมและเป็นเจ้าของลิขสิทธิ์

เชเดอร์ที่เหมาะกับอุปกรณ์เคลื่อนที่ของเครื่องมือเกม

Game Engine จะแตกต่างกันในวิธีที่เชื่อมโยงวัสดุและ Shader เอนจิน Unity สร้างเชเดอร์ได้หลายรายการ แต่แต่ละวัสดุจะมีเชเดอร์ได้เพียงรายการเดียว Unreal Engine 4 สามารถใช้ Shader ที่แตกต่างกันกับ Material ตามแพลตฟอร์มเป้าหมาย

ดูคำจำกัดความของ Shader และ Material ได้ที่ แนวทางปฏิบัติแนะนำเกี่ยวกับ Material และ Shader สำหรับศิลปิน

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

Unity

Unity มีเครื่องมือการแสดงผลหลายรายการ สำหรับเกมมือถือสมัยใหม่ ตัวเลือกที่ดีที่สุดคือ Universal Render Pipeline (URP) URP มีชุดเชเดอร์มาตรฐาน ที่ปรับขนาดความซับซ้อนโดยอัตโนมัติตามแพลตฟอร์ม เป้าหมาย ตัวเรนเดอร์ Unity รุ่นเดิมมีชุดเชเดอร์ที่ออกแบบมา สำหรับแพลตฟอร์มอุปกรณ์เคลื่อนที่ โดยเชดเดอร์เหล่านี้จะจัดกลุ่มไว้ในหมวดหมู่อุปกรณ์เคลื่อนที่

Unreal Engine 4

Unreal Engine จะเลือก Shader สำหรับอุปกรณ์เคลื่อนที่ตามแพลตฟอร์มเป้าหมายที่เลือก เอาต์พุตภาพจากเชเดอร์บนอุปกรณ์เคลื่อนที่อาจแตกต่างจากเชเดอร์เริ่มต้นของ Model 5 คุณเปลี่ยนระดับการแสดงตัวอย่างในโปรแกรมแก้ไข Unreal เพื่อจำลองเอาต์พุตการแสดงผลของ Shader บนอุปกรณ์เคลื่อนที่ได้ แม้ว่าจะมี ความแตกต่างกันบ้าง แต่ Unreal ใช้กระบวนการเดียวกันสำหรับวัสดุในทุกแพลตฟอร์ม ดังนั้น Shader สำหรับอุปกรณ์เคลื่อนที่จะมีภาพและลักษณะการทำงานคล้ายกับ Shader เริ่มต้นโดยทั่วไป

การตั้งค่าการแสดงตัวอย่างบนอุปกรณ์เคลื่อนที่ในโปรแกรมแก้ไข Unreal
รูปที่ 1 การตั้งค่าการแสดงตัวอย่างบนอุปกรณ์เคลื่อนที่ในโปรแกรมแก้ไข Unreal

ลดจำนวนตัวอย่างพื้นผิว

เกมที่กำหนดเป้าหมายเป็นอุปกรณ์เคลื่อนที่ควรใช้พื้นผิวใน วัสดุให้น้อยที่สุด พื้นผิวที่เพิ่มแต่ละรายการต้องมีการสุ่มตัวอย่างพื้นผิวเพิ่มเติม ซึ่ง จะใช้แบนด์วิดท์ของหน่วยความจำและเพิ่มการใช้พลังงาน Unreal Engine 4 แนะนํา ให้ใช้พื้นผิววัสดุสูงสุด 5 รายการเมื่อเรียกใช้ในอุปกรณ์เคลื่อนที่ แม้แต่ตัวอย่างพื้นผิว 5 รายการก็อาจมีราคาสูงเกินไปสำหรับการใช้งานอย่างแพร่หลายในอุปกรณ์หลายเครื่อง กลยุทธ์ในการลดจำนวนตัวอย่างพื้นผิว ได้แก่

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

ปิดไฟเมื่อเป็นไปได้

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

การเปรียบเทียบโมเดลที่เรนเดอร์โดยมีและไม่มีแสง
รูปที่ 2 ตัวอย่างโมเดลที่แสดงผลโดยใช้แสงแบบเรียลไทม์ (ซ้าย) และไม่ใช้แสงแบบเรียลไทม์ (ขวา)

ลดการใช้ความโปร่งใส

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

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

ตัวอย่างเครื่องมือแสดงภาพการวาดทับในโปรแกรมแก้ไข Unity
รูปที่ 3 ตัวอย่างเครื่องมือแสดงภาพการวาดทับในโปรแกรมแก้ไข Unity
ตัวอย่างเครื่องมือแสดงภาพการวาดทับในโปรแกรมแก้ไข Unreal
รูปที่ 4 ตัวอย่างเครื่องมือแสดงภาพการวาดทับในโปรแกรมแก้ไข Unreal

ใช้วิธีอัลฟ่าที่เหมาะสม

วิธีการที่ใช้กันมากที่สุดในการใช้ความโปร่งใสคือการผสมอัลฟ่าและการทดสอบอัลฟ่า

การทดสอบอัลฟ่าจะทำให้วัสดุของออบเจ็กต์ดูทึบแสง 100% หรือโปร่งแสง 100% คุณกำหนดค่าเกณฑ์ค่าอัลฟ่าสำหรับการตัดค่านี้ได้ ใน Unity ความโปร่งใสประเภทนี้เรียกว่า Cutout ใน Unreal Engine 4 จะเรียกว่าโหมดผสมผสานมาสก์

การผสมอัลฟ่าช่วยให้วัสดุของออบเจ็กต์มีความโปร่งใสได้หลายระดับ และ ทำให้ออบเจ็กต์ดูโปร่งใสบางส่วนได้ Unity เรียกความโปร่งใสประเภทนี้ว่าโปร่งใส ใน Unreal Engine 4 จะเรียกว่าโหมดการผสมโปร่งแสง

การเปรียบเทียบระหว่างการผสมอัลฟ่ากับการทดสอบอัลฟ่า
รูปที่ 5 ตัวอย่างรูปภาพ (ซ้าย) ที่แสดงผลโดยใช้การผสมอัลฟ่า (ตรงกลาง) และการทดสอบอัลฟ่า (ขวา)

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

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

ความซับซ้อนของ Shader ของโปรไฟล์

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

Unreal Engine 4 มีโหมดมุมมองความซับซ้อนของ Shader ที่ให้ค่าประมาณต้นทุน สำหรับออบเจ็กต์ในฉาก

โหมดมุมมองความซับซ้อนของ Shader ในโปรแกรมแก้ไข Unreal
รูปที่ 6 โหมดมุมมองความซับซ้อนของ Shader ในโปรแกรมแก้ไข Unreal

นอกจากนี้ คุณยังใช้ฟีเจอร์สถิติของ Material ของ Unreal เพื่อสร้างโปรไฟล์ต้นทุนของ Material ขณะเขียนได้ด้วย

สถิติของวัสดุจะแสดงในโปรแกรมแก้ไข Unreal
รูปที่ 7 สถิติของวัสดุจะแสดงในโปรแกรมแก้ไข Unreal

คำนวณใน Vertex Shader

โดยปกติแล้วการคำนวณ Shader การแสดงผลจะแยกออกเป็น Vertex Shader และ Fragment Shader (หรือที่เรียกว่า Pixel Shader) โดยปกติแล้ว จำนวนเศษที่แสดงผล จะมากกว่าจำนวนจุดยอด หากมีการคำนวณที่มีค่าใช้จ่ายสูง ใน Vertex Shader ระบบจะเรียกใช้การคำนวณนั้นน้อยครั้งกว่าใน Fragment Shader

อย่างไรก็ตาม หาก Fragment Shader ใช้ข้อมูลนี้ คุณต้องส่งข้อมูลจาก Vertex Shader หากปริมาณข้อมูลที่โอนมีขนาดใหญ่เกินไป การคำนวณใน Fragment Shader อาจมีประสิทธิภาพสูงกว่า คุณสามารถใช้เครื่องมือสร้างโปรไฟล์เพื่อประเมินการใช้ Tiler เพื่อกำหนดตำแหน่ง Shader ที่ดีที่สุดสำหรับการคำนวณชุดหนึ่ง Unreal Engine 4 มีฟีเจอร์ UV ที่กำหนดเอง ซึ่งช่วยในการสร้างโปรไฟล์นี้ได้

หลีกเลี่ยงการดำเนินการทางคณิตศาสตร์ที่มีค่าใช้จ่ายสูง

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

  • หมายเหตุเพิ่มเติม
  • การลบ
  • การคูณ

การดำเนินการที่มีค่าใช้จ่ายสูงกว่า ได้แก่

  • หน่วยงาน
  • ฟังก์ชันอดิศัย (sin, cos, power, log, tan)

ประสิทธิภาพของโปรไฟล์บ่อยครั้ง

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