4 วิธีเพิ่ม Performance ให้โปรเจค Unity !!

vertex-colors-e1398325431768

momo-fry-owl-bandits

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

1. Use Performance Profiler
  • หากเพื่อนๆ ต้องการที่จะทำ Performance ให้กับตัวโปรเจคของตนเอง สิ่งแรกที่เราต้องใช้ก็คือ Profiler โดย Profiler นั้นคือเครื่องมือที่จะทำให้เราสามารถตรวจสอบและวิเคราะห์ Performance ในการทำงานในส่วนต่างๆ ของโปรเจคเรา ซึ่งสามารถตรวจสอบได้ลึกถึงเฟรมต่อเฟรม ทั้งนี้เราจะเห้นข้อมูลทั้งหมดในรูปแบบของเส้นกราฟที่ CPU กำลังทำงานอยู่แบบ real-time โดยเราสามารถแยกเรื่องที่จะดูได้เป็นหลายๆ เรื่องไม่ว่าจะเป็น Rendering, Scripts, Physics, GarbageCollector, VSync และอื่นๆ
  • ทั้งนี้สำหรับเกมมือถือแล้ว ส่วนที่มีปัญหาอยู่บ่อยๆ นั้นก็คือเรื่อง Rendering ซึ่งมีผลเป็นอย่างมากกับ CPU ดังนั้นหากตรงนี้เรามีค่าตัวเลขที่สูง สิ่งที่เราต้องตรวจสอบหรือแก้ไขก็คือตัวกราฟฟิกของเราเอง เช็คขนาด, ความละเอียด, จำนวนจุด vertex, จนรวมไปถึง poly ทั้งหมด นอกจากนี้เรายังจำเป็นต้องตรวจสอบการทำงานของ Scripts ในการโหลกข้อมูล, และการคำนวนของฟิสิกส์

profiler

2. Static Batching
  • Static Batching ถือเป็นฟีเจอร์ของ Unity ที่จะช่วยประหยัดจำรอบของ CPU ให้ ทั้งนี้ในทุกเวลาที่มีการแสดงผลตัว obj มันจำเป็นที่จะต้องเก็ตค่าข้อมูลจากตัวต้นฉบับ หรือที่คนทั่วไปเรียกกันว่า “Draw Call” โดยการวาด Draw Call แต่ละครั้งนั้นหมายถึงการทำงานของ CPU ที่มากขึ้น เพราะฉะนั้นสิ่งที่ดีที่สุดคือการลดจำนวน Draw Call ลง และนี่คือส่วนที่จะนำ Batching มาใช้ เพราะมันจะทำให้เรามั่นใจว่าไม่มีการนำ Draw Call ที่ไม่จำเป็นมาใช้ ซึ่ง Batching จะมีให้เลือกใช้งานอยู่ 2 บบด้วยกันคือ Static และ Dynamic
  • และ Static ก็คือเป็นแนวทางที่จำให้ Performance ของเราดีขึ้นแบบก้าวกระโดด ซึ่งถ้าหากคุณต้องการใช้ Static Batching ให้มีประสิทธิภาพสูงสุด นั่นคือคุณต้องมี Materials ที่แแตกต่างน้อยที่สุดด้วย ดังนั้นวิธีการก็คือการรวม Materials ทั้งหมดของเราไว้ใน Texture แผ่นใหญ่หนึ่งแผ่น โดยเราจะเลือกใช้ vertex colors และ pattern texture รูปแบบเดียวกันสำหรับ obj ทั้งหมด ซึ่งการทำ vertex colors จะช่วยให้สีแต่ละ vertex ลบตัวเองเมื่อต้องการใช้ real-time lighting หรือถ้าพูดง่ายๆ คือ เราควรจัดการว่า obj ไหนเป็นชนิดเดียวกันบ้าง จับมันมารวมกันแล้วทำใน Texture แผ่นเดียวไปเลย ซึ่งนั่นจะส่งผลให้ obj ที่อยู่ในนั้นทั้งหมดใช้ Materials ชิ้นเดียวกันด้วย แต่นั่นแหละคือเป้าหมายของ Static Batching
  • ทั้งนี้การใช้ vertex colors ทั้งหมดอาจทำให้งานออกมาดูน่าเบื่อ ดังนั้นเราจึงสมควรมี pattern texture อยู่สองสามแบบ ซึ่งจะถูก multiplied ด้วย vertex colors ซึ่งจะให้จำนวน bit ที่มากกว่า ทั้งนี้เมื่อจบทุกขั้นตอนแล้ว ขั้นตอนสุดท้ายคือการทำ lightmap สำหรับซีนของเรา เพราะการทำ lightmap จะไม่จำเป็นต้องใช้พื้นที่ memory แต่อย่างใด อย่างไรก็ตาม Static Batching จะเป็นเทคนิคที่ใช้กับวัตถุที่ไม่มีการขยับใดๆ เท่านั้น

gate_patterns

3. Dynamic Batching
  • ถ้า Static Batching ใช้กับ obj ที่ไม่เคลื่อนไหว Dynamic Batching ก็เป็นเทคนิคที่ใช้กับ obj ที่เคลื่อนไหวโดยเฉพาะ ซึ่งขอแนะนำว่าเราควรใช้กับวัตถุที่มีขนาดเล็กๆ ไว้จะดีที่สุด โดยขนาดเหล่านี้เราจะวัดได้จากจำนวน vertex  ของ obj นั้น ซึ่งเราจำเป็นต้องรู้ก่อนว่ามือถือในขณะนี้สามารถรับได้ขนาดไหนแล้ว แต่ถ้าน้อยได้จะดีกว่าครับ
  • ทั้งนี้ในตัวบทความที่ผมนำมาเขียนมีเทคนิคอยู่เล็กน้อย ซึ่งผมคิดว่ามันค่อนข้างจะสรุปมาให้อ่านยาก ดังนั้นหากใครสนใจสามารถเข้าไปอ่านได้ที่นี่ [คลิ๊ก !!] (ค้นหาคำว่า “Some useful tips from the Unity manual:”)
4. Audio Optimizations
  • เสียงถือเป็นอีกหนึ่งเรื่องทีทำให้ Performance ของเราตกลง ทั้งนี้ Unity ได้บอกไว้ว่าการทำ Compressed audio จะเหมาะกับเพลงที่มีความยาวมากๆ อย่าง background music หรือ dialog ในขณะที่ Native จะเหมาะกับเสียงสั้นๆ อย่าง short sound effects แต่การแนะนำนี้ก้มีปัญหาอยู่บ้าง เพราะถ้าหากเราใช้วิธี Compressed ได้ไม่ถูกต้อง มันจะกิน memory และ CPU ของเรา ทั้งนี้เราสามารถแก้ไขปัญหาเหล่านี้โดยการเข้าไปตั้งค่าได้ที่ “Decompress On Load” ซึ่งวิธีนี้แม้จะเพิ่ม Performance แต่มันก็ทำให้เกิด memory footprint ที่ skyrocket ได้ ดังนั้นเราควรใช้วิธีพวกนี้เมื่อจำเป็นจริงๆ เท่านั้น
  • และนี่คือกฎการตั้งค่าของเสียงรูปแบบต่างๆ
    • Short Clips – Native
    • Longer (or looping) clips – compressed in memory
    • Music – Stream from disc
    • Files which consistently cause CPU spikes – Decompress on load
  • โดยถ้าคุณทำตามกฎเหล่านี้ เสียงก็จะไม่เป็นปัญหาให้กับคุณอีก ยกเว้นจะเปิดเสียงทั้งหมดในครั้งเดียว

แหล่งที่มา paladinstudios