บทนำ:
มีการคัดค้านเล็กน้อยในความคิดเห็นและฉันคิดว่าพวกเขาส่วนใหญ่มาจากความเข้าใจผิดของสิ่งที่เราหมายถึงเมื่อเราพูดว่า "การเพิ่มประสิทธิภาพก่อนวัยอันควร" - ดังนั้นฉันต้องการเพิ่มความกระจ่างเล็กน้อย
"อย่าเพิ่มประสิทธิภาพก่อนเวลาอันควร" ไม่ได้หมายความว่า "เขียนโค้ดที่คุณรู้ว่าไม่ดีเพราะ Knuth บอกว่าคุณไม่ได้รับอนุญาตให้ล้างข้อมูลจนกว่าจะสิ้นสุด"
หมายความว่า "อย่าเสียเวลาและความชัดเจนในการปรับให้เหมาะสมจนกว่าคุณจะรู้ว่าส่วนใดของโปรแกรมของคุณต้องการความช่วยเหลือที่เร็วขึ้น" เนื่องจากโปรแกรมทั่วไปใช้เวลาส่วนใหญ่ในคอขวดไม่กี่การลงทุนในการเพิ่มประสิทธิภาพ "ทุกอย่าง" อาจไม่ได้รับการเร่งความเร็วแบบเดียวกันกับคุณโดยเน้นไปที่การลงทุนแบบเดียวกันในรหัสที่เป็นคอขวด
ซึ่งหมายความว่าเมื่อมีข้อสงสัยเราควร:
ชอบรหัสที่เขียนง่ายเข้าใจง่ายและปรับเปลี่ยนได้ง่ายสำหรับผู้เริ่ม
ตรวจสอบว่าจำเป็นต้องมีการปรับให้เหมาะสมเพิ่มเติมหรือไม่ (โดยปกติการทำโปรไฟล์โปรแกรมที่กำลังรันอยู่แม้ว่าจะมีความคิดเห็นหนึ่งข้อด้านล่างที่ใช้ในการวิเคราะห์ทางคณิตศาสตร์ - ความเสี่ยงเพียงอย่างเดียวที่คุณต้องตรวจสอบคือคณิตศาสตร์ของคุณ)
การปรับให้เหมาะสมก่อนวัยอันควรไม่ใช่ :
การตัดสินใจทางสถาปัตยกรรมเพื่อจัดโครงสร้างโค้ดของคุณในแบบที่จะปรับขนาดตามความต้องการของคุณ - เลือกโมดูล / ความรับผิดชอบ / อินเตอร์เฟส / ระบบการสื่อสารที่เหมาะสมในวิธีที่พิจารณา
ประสิทธิภาพอย่างง่ายที่ไม่ต้องใช้เวลาเพิ่มเติมหรือทำให้โค้ดอ่านยากขึ้น สิ่งต่าง ๆ เช่นการใช้การพิมพ์ที่แข็งแกร่งอาจมีประสิทธิภาพและทำให้เจตนาของคุณชัดเจนยิ่งขึ้น การแคชการอ้างอิงแทนการค้นหาซ้ำ ๆ เป็นอีกตัวอย่างหนึ่ง (ตราบใดที่กรณีของคุณไม่ต้องการตรรกะการตรวจสอบแคชที่ซับซ้อน - อาจระงับการเขียนไว้จนกว่าคุณจะทำโปรไฟล์แบบง่าย ๆ ก่อน)
การใช้อัลกอริทึมที่เหมาะสมสำหรับงาน A * นั้นเหมาะสมที่สุดและซับซ้อนกว่าการค้นหากราฟเส้นทางอย่างละเอียด นอกจากนี้ยังเป็นมาตรฐานอุตสาหกรรม การทำซ้ำชุดรูปแบบการใช้วิธีที่พยายามแล้วจริงเช่นนี้จะทำให้โค้ดของคุณง่ายต่อการเข้าใจมากกว่าถ้าคุณทำอะไรง่ายๆ แต่ตอบโต้กับวิธีปฏิบัติที่ดีที่สุดที่รู้จัก หากคุณมีประสบการณ์การทำงานในคอขวดที่ใช้ฟีเจอร์เกม X ทางเดียวในโปรเจ็กต์ก่อนหน้านี้คุณไม่จำเป็นต้องไปที่คอขวดเดิมอีกครั้งในโปรเจ็กต์นี้เพื่อให้รู้ว่าเป็นเรื่องจริง - คุณสามารถและควร เกม.
การเพิ่มประสิทธิภาพทุกประเภทนั้นมีความชอบธรรมและโดยทั่วไปจะไม่ระบุว่า "ก่อนกำหนด" (เว้นแต่คุณจะลงไปที่โพรงกระต่ายโดยใช้การหาตำแหน่งที่ทันสมัยสำหรับแผนที่กระดานหมากรุกขนาด 8x8 ของคุณ ... )
ดังนั้นตอนนี้เมื่อล้างข้อมูลไปแล้วทำไมเราอาจพบว่านโยบายนี้มีประโยชน์ในเกมโดยเฉพาะ:
โดยเฉพาะใน gamedev ความเร็วการทำซ้ำเป็นสิ่งที่มีค่าที่สุด เรามักจะนำไปใช้และนำความคิดกลับมาใช้ใหม่มากกว่าที่จะมาพร้อมกับเกมที่เสร็จสิ้นแล้วพยายาม "ค้นหาความสนุก"
หากคุณสามารถสร้างต้นแบบกลไกได้อย่างตรงไปตรงมาและอาจไร้เดียงสาเล็กน้อยและลองเล่นมันในวันถัดไปคุณจะอยู่ในตำแหน่งที่ดีกว่าถ้าคุณใช้เวลาหนึ่งสัปดาห์ในการสร้างรุ่นที่ดีที่สุดก่อน โดยเฉพาะอย่างยิ่งถ้ามันกลายเป็นดูดและคุณก็ทิ้งมันไป การทำมันเป็นวิธีที่ง่ายเพื่อให้คุณสามารถทดสอบได้ในช่วงต้นสามารถบันทึกรหัสที่เสียไปกับการเพิ่มประสิทธิภาพที่คุณไม่ได้เก็บไว้ได้
โดยทั่วไปโค้ดที่ไม่ได้รับการปรับให้เหมาะสมนั้นยังง่ายต่อการปรับเปลี่ยนและลองใช้ตัวแปรที่แตกต่างกันมากกว่าโค้ดที่ได้รับการปรับแต่งอย่างละเอียดเพื่อทำสิ่งที่เหมาะสมที่สุดอย่างหนึ่งซึ่งมีแนวโน้มที่จะเปราะบางและแก้ไขยากขึ้นโดยไม่ทำให้แตก ดังนั้นการรักษาโค้ดให้ง่ายและง่ายต่อการเปลี่ยนแปลงจึงมักจะคุ้มค่ากับความไม่มีประสิทธิภาพของรันไทม์เล็กน้อยตลอดการพัฒนาส่วนใหญ่ (เรามักจะพัฒนาบนเครื่องเหนือข้อกำหนดเป้าหมายเพื่อให้เราสามารถดูดซับค่าใช้จ่ายและมุ่งเน้นไปที่ประสบการณ์เป้าหมายก่อน) ได้ล็อคสิ่งที่เราต้องการจากคุณสมบัติและสามารถเพิ่มประสิทธิภาพส่วนที่เรารู้ว่าช้า
ใช่การปรับโครงสร้างบางส่วนของโครงการในช่วงปลายของการพัฒนาเพื่อปรับปรุงจุดที่ช้าที่สุดอาจเป็นเรื่องยาก แต่การปรับโครงสร้างนั้นซ้ำ ๆ ตลอดการพัฒนาเพราะการปรับปรุงที่คุณทำเมื่อเดือนที่แล้วไม่เข้ากันกับทิศทางของเกมที่มีวิวัฒนาการมาตั้งแต่นั้นมาหรือแก้ไขบางสิ่งที่กลายเป็นคอขวดจริงเมื่อคุณได้รับคุณสมบัติและเนื้อหาเพิ่มเติม ใน.
เกมแปลกและทดลอง - มันยากที่จะคาดการณ์ว่าโครงการเกมและความต้องการด้านเทคโนโลยีของมันจะมีวิวัฒนาการและประสิทธิภาพที่จะแน่นที่สุด ในทางปฏิบัติเรามักจะจบลงด้วยความกังวลเกี่ยวกับสิ่งที่ผิด - ค้นหาคำถามเกี่ยวกับประสิทธิภาพที่นี่และคุณจะเห็นหัวข้อทั่วไปที่ปรากฏขึ้นของ devs ที่ได้รับฟุ้งซ่านจากสิ่งต่าง ๆ บนกระดาษที่มีแนวโน้มว่าจะไม่เป็นปัญหาเลย
เพื่อยกตัวอย่างที่น่าทึ่ง: หากเกมของคุณมี GPU (ไม่ใช่เรื่องแปลก) ดังนั้นทุกครั้งที่ใช้การไฮเปอร์ - ออปติไมซ์และเธรดการทำงานของ CPU อาจไม่ได้รับประโยชน์ที่จับต้องได้เลย ชั่วโมง dev ทั้งหมดเหล่านั้นอาจถูกใช้ไปกับการใช้งานและการขัดเกลาคุณสมบัติการเล่นเกมแทนเพื่อประสบการณ์การเล่นที่ดีขึ้น
โดยรวมแล้วเวลาส่วนใหญ่ที่คุณใช้ในการทำงานกับเกมจะไม่ถูกใช้กับรหัสที่จบลงด้วยการเป็นคอขวด โดยเฉพาะอย่างยิ่งเมื่อคุณกำลังทำงานกับเครื่องยนต์ที่มีอยู่สิ่งที่มีราคาแพงมากในการเรนเดอร์และระบบฟิสิกส์นั้นส่วนใหญ่อยู่ในมือคุณ ณ จุดนั้นงานของคุณในสคริปต์การเล่นเกมคือโดยทั่วไปไม่ต้องออกนอกทางของเครื่องยนต์ - ตราบใดที่คุณไม่ต้องโยนประแจเข้าไปที่นั่นแล้วคุณอาจจะออกมาค่อนข้างโอเคสำหรับการสร้างครั้งแรก
ดังนั้นนอกเหนือจากความสะอาดของรหัสและการจัดทำงบประมาณเล็กน้อย (เช่นอย่าค้นหา / สร้างสิ่งต่าง ๆ ซ้ำ ๆ หากคุณสามารถนำมันกลับมาใช้ใหม่ได้อย่างง่ายดายรักษาข้อความค้นหาการค้นหาเส้นทาง / ฟิสิกส์หรือการอ่าน GPU แบบเรียบง่ายเป็นต้น - เพิ่มประสิทธิภาพก่อนที่เราจะทราบว่าปัญหาที่แท้จริงจะกลายเป็นสิ่งที่ดีสำหรับการผลิต - ช่วยให้เราประหยัดเวลาในการแก้ไขสิ่งที่ผิดและทำให้รหัสของเราง่ายขึ้นและง่ายขึ้นในการปรับแต่งโดยรวม