คู่มือปฏิบัติแบบใช้ได้จริงเกี่ยวกับแนวคิดเน้นประสิทธิภาพแบบ John Carmack: การโปรไฟล์ งบเวลาเฟรม การแลกเปลี่ยน และการส่งมอบระบบเรียลไทม์ที่ซับซ้อน

\nงบเหล่านี้โต้ตอบกัน การประหยัดเวลา GPU โดยเพิ่มการแบตช์ที่ใช้ CPU มากขึ้นอาจล้มเหลว และการลดหน่วยความจำอาจเพิ่มค่าใช้จ่ายการสตรีมหรือการดีคอมเพรสชัน\n\n### ตัวอย่าง: 16.6 ms ที่ 60 FPS\n\nถ้าเป้าหมายของคุณคือ งบรวมคือ การแจกแจงคร่าวๆ อาจเป็น:\n\n- CPU: (ซิมูเลชัน, เกมเพลย์, การมองเห็น)\n- GPU: (เรนเดอร์ + โพส)\n- OS/ไดรเวอร์ + บัฟเฟอร์โอเวอร์เฮด: \n\nถ้า CPU หรือ GPU เกินงบ คุณจะพลาดเฟรม นั่นคือเหตุผลที่ทีมพูดว่า "CPU-bound" หรือ "GPU-bound" — ไม่ใช่แค่ป้ายกำกับ แต่เป็นวิธีตัดสินใจว่าจะเอามิลลิวินาทีถัดไปจากตรงไหนจริงๆ\n\n### "เร็วพอ" เป็นข้อกำหนดของผลิตภัณฑ์\n\nประเด็นไม่ใช่ไล่ตามเมตริกสวยงามอย่าง "FPS สูงสุดบนพีซีระดับไฮเอนด์" แต่เป็นการนิยามว่า สำหรับผู้ชมของคุณหมายถึงอะไร—ฮาร์ดแวร์เป้าหมาย ความละเอียด ขีดจำกัดแบตเตอรี่ ความร้อน และความไวต่ออินพุต—แล้วปฏิบัติต่อประสิทธิภาพเป็นงบประมาณที่ชัดเจนซึ่งคุณจัดการและคุ้มครองได้\n\n## โปรไฟล์ก่อน: วัด แล้วค่อยตัดสินใจ\n\nการเคลื่อนไหวเริ่มต้นของ Carmack ไม่ใช่ "ปรับจูน" แต่คือ "ยืนยัน" ปัญหาประสิทธิภาพเรียลไทม์เต็มไปด้วยคำอธิบายที่ฟังดูเป็นไปได้—หยุดของ GC, "เชดเดอร์ช้า", "draw calls เยอะเกิน"—และส่วนใหญ่จะไม่ถูกต้องใน บน การโปรไฟล์คือวิธีเปลี่ยนสัญชาตญาณให้เป็นหลักฐาน\n\n### เริ่มที่การวัด (ก่อนจะเดา)\n\nปฏิบัติต่อการโปรไฟล์เหมือนฟีเจอร์ระดับแรก ไม่ใช่ของกู้วิกฤตช่วงท้าย จับเวลาเฟรม ไทม์ไลน์ CPU/GPU และค่าที่อธิบายได้ (สามเหลี่ยม, draw calls, การเปลี่ยนสถานะ, การจัดสรร, cache miss ถ้าทำได้) เป้าหมายคือคำตอบเดียว: \n\nแบบจำลองที่มีประโยชน์: ในทุกเฟรมที่ช้า สิ่งหนึ่งคือข้อจำกัดที่แท้จริง อาจเป็น GPU ติดอยู่กับพาสหนัก CPU ติดอยู่ที่อัพเดตแอนิเมชัน หรือเธรดหลักรอการซิงโครไนซ์ หาจุดจำกัดนั้นก่อน ทุกอย่างที่เหลือคือเสียงรบกวน\n\n### ทำซ้ำเหมือนนักวิทยาศาสตร์\n\nวงปฏิบัติที่มีวินัยช่วยป้องกันการทำงานแกว่ง:\n\n- วัดฐานด้วยฉากและเส้นทางกล้องที่ทำซ้ำได้\n- เปลี่ยน \n- วัดใหม่ และจดบันทึกความแตกต่าง\n\nถ้าการปรับปรุงไม่ชัดเจน ให้ถือว่ามันไม่ช่วย—เพราะโดยมากมันจะไม่รอดเมื่อมีคอนเทนต์ใหม่เข้ามา\n\n### ระวังการปรับแต่งแบบพลาสโบ\n\nงานประสิทธิภาพมีความเสี่ยงต่อการหลอกตัวเองสูง: \n- ฉากทดสอบไม่สอดคล้อง, บิลด์ดีบัก, งานแบ็กกราวด์, การลดคล็อก/ความร้อน, ความแตกต่างของ vsync
เวลาเฟรมคือ เวลาต่อเฟรม เป็นมิลลิวินาที (ms) และเชื่อมโยงโดยตรงกับงานที่ CPU/GPU ทำ
เลือกเป้าหมาย (เช่น 60 FPS) แล้วแปลงเป็นเดดไลน์ (16.6 ms) จากนั้นแบ่งเดดไลน์นั้นเป็นงบประมาณชัดเจน
ตัวอย่างเริ่มต้น:
ปฏิบัติต่อค่าเหล่านี้เป็นข้อกำหนดผลิตภัณฑ์ และปรับให้เข้ากับแพลตฟอร์ม ความละเอียด ความร้อน และเป้าหมายหน่วงตอบสนองอินพุต
เริ่มจากทำให้การทดสอบทำซ้ำได้ แล้ววัดก่อนจะเปลี่ยนอะไร
เมื่อรู้ว่า เวลาไปที่ไหน แล้วค่อยตัดสินใจจะปรับจุดไหน
รันการทดลองที่โฟกัสเพื่อแยกตัวจำกัด:
อย่าเริ่มเขียนระบบใหม่จนกว่าจะระบุเป็นมิลลิวินาทีได้ว่าอะไรเป็นต้นเหตุ
เพราะผู้ใช้จะรู้สึกต่อเฟรมแย่ที่สุด ไม่ใช่ค่าเฉลี่ย
ติดตาม:
บิลด์ที่เฉลี่ย 16.6 ms แต่มีสไปค์ขึ้นเป็น 80 ms จะยังคงทำให้ประสบการณ์แย่
ทำให้งานหนักคาดเดาได้และจัดเวลา:
นอกจากนี้บันทึกสไปค์เพื่อให้สามารถทำซ้ำและแก้ไข ไม่ใช่แค่อยากให้มันหายไป
ทำให้การแลกเปลี่ยนชัดเจนเป็นตัวเลขและผลกระทบต่อผู้ใช้
ใช้ประโยคแบบนี้:
แล้วตัดสินใจตามเกณฑ์ที่ตกลงกัน:
เพราะความไม่เสถียรในการทำงานทำให้ข้อมูลประสิทธิภาพไม่น่าเชื่อถือ
ขั้นตอนปฏิบัติ:
ถ้าพฤติกรรมเปลี่ยนระหว่างการรัน คุณจะจบลงด้วยการปรับแต่งจากเสียงรบกวน ไม่ใช่คอขวดจริง
งานที่เร็วไม่ใช่แค่โค้ดที่ทำงานเร็ว แต่คือการจัดงานให้ CPU/GPU ทำงานอย่างมีประสิทธิภาพ
เน้นที่:
บ่อยครั้ง การลดโอเวอร์เฮดให้มากกว่าการปรับลูปย่อยจะได้ผลมากกว่า
ทำให้ประสิทธิภาพสามารถวัด ทำซ้ำ และไม่พลาดโดยไม่ตั้งใจ
ถ้ายังไม่แน่ใจ ให้เลือกการตัดสินใจที่ย้อนกลับได้ (feature flags, ระดับคุณภาพที่ปรับได้)
เมื่อพบการถดถอย: bisect หาเปลี่ยนแปลงต้นเหตุ มอบเจ้าของงาน และ revert อย่างรวดเร็ว ถ้ามันขัดขวางการปล่อย