วิเคราะห์การกำหนดเวลาเธรด

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

  • การเว้นระยะเฟรม
  • การทำงานแบบหลายเธรดและการทำงานแบบขนานของเธรด
  • แอฟฟินิตี้ของแกน CPU

Multithreading

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

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

เกมที่มีเทรดหลักและเทรดการแสดงผลที่ทำงานแบบขนานกันได้ดี รวมถึงเทรดผู้ปฏิบัติงานและเทรดเสียง
รูปที่ 1 เกมที่มีเทรดหลักและเทรดการแสดงผลที่ทำงานแบบขนานกัน รวมถึงเทรดผู้ปฏิบัติงานและเทรดเสียง

แอฟฟินิตี้ของแกน CPU

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

  • ไม่ว่าเธรดเกมจะทำงานบนคอร์ที่เหมาะสมที่สุดสำหรับภาระงานหรือไม่
  • เธรดเกมสลับไปมาระหว่างคอร์บ่อยหรือไม่

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

  • แกนประมวลผล 1 หรือ 2 แกนจะให้ประสิทธิภาพสูงสุด แต่ใช้พลังงานมากกว่า บางครั้งก็เรียกว่าคอร์ "ใหญ่"
  • ส่วนคอร์อื่นๆ จะมีประสิทธิภาพสูงสุดต่ำกว่า แต่ประหยัดพลังงานมากกว่า บางครั้งก็เรียกว่าคอร์ "เล็ก"
  • ไม่บังคับ: คอร์อย่างน้อย 1 คอร์จะช่วยให้ประสิทธิภาพและพลังงานสมดุลกัน บางครั้งเรียกว่าคอร์ "กลาง"

คุณอาจตรวจสอบลักษณะการทำงานของเธรด CPU ในส่วนการใช้งาน CPU ได้โดยการเปิดใช้ CPU ในการกำหนดค่าโปรไฟล์เมื่อทำการติดตาม การซูมเข้าส่วนหนึ่งของ การติดตามที่ใช้เวลาน้อยกว่า 200 มิลลิวินาที จะช่วยให้คุณดูแต่ละกระบวนการที่ทำงานในคอร์ CPU ของอุปกรณ์ได้ โดยปกติแล้ว แกนขนาดเล็กจะสอดคล้องกับดัชนีขนาดเล็ก (เช่น CPU '0'-'3') ในขณะที่แกนขนาดใหญ่จะสอดคล้องกับดัชนีที่สูงกว่า (เช่น CPU '6'-'7') และแกนกลางหากมีจะใช้ดัชนีระหว่างนั้น (เช่น CPU '5'-'6') ซึ่งเป็นไปตามธรรมเนียมทั่วไป แต่ก็ไม่ได้รับประกัน

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

เกมที่มีเทรดหลักและเทรดการแสดงผลทำงานบนคอร์ขนาดใหญ่เป็นหลัก (CPU 6-7) แสดงเป็นสีฟ้าอ่อน
รูปที่ 2 เกมที่มีเทรดหลักและเทรดการแสดงผลทำงานบนคอร์ขนาดใหญ่เป็นหลัก (CPU 6-7) ซึ่งแสดงเป็นสีฟ้าอ่อน

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

เกมที่มีเธรดหลัก (เธรด-7) และเธรดการแสดงผล (เธรด-8) ที่สลับไปมาระหว่างคอร์ต่างๆ ซึ่งแสดงเป็นสีม่วง
รูปที่ 3 เกมที่มีเธรดหลัก (เธรด-7) และเธรดการแสดงผล (เธรด-8) ที่สลับไปมาระหว่างคอร์ ซึ่งแสดงเป็นสีม่วง

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

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

    อุปกรณ์รุ่นใหม่หรือมีราคาสูงกว่าอาจเรียกใช้ภาระงานที่กำหนดได้อย่างสบายๆ บน Little Core แต่อุปกรณ์รุ่นเก่าหรือมีราคาถูกกว่าอาจต้องใช้ Big Core เพื่อให้ทันกำหนดเวลาสำหรับภาระงานเดียวกัน

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

ด้วยเหตุนี้ โดยทั่วไปจึงควรหลีกเลี่ยงการตั้งค่าความสัมพันธ์ของ CPU ด้วยตนเอง