โดยเฉลี่ยแล้วแอสเซมบลีที่ใช้ในรหัสเกมสมัยใหม่บ่อยแค่ไหน?
โดยเฉพาะบนแพลตฟอร์มที่มีคอมไพเลอร์ C ++ ที่ดีอยู่แล้วเช่น x86, PPC หรือ ARM - เพราะฉันคิดว่าเกมบนระบบฝังตัวใช้ประโยชน์จากการประกอบอย่างกว้างขวาง
โดยเฉลี่ยแล้วแอสเซมบลีที่ใช้ในรหัสเกมสมัยใหม่บ่อยแค่ไหน?
โดยเฉพาะบนแพลตฟอร์มที่มีคอมไพเลอร์ C ++ ที่ดีอยู่แล้วเช่น x86, PPC หรือ ARM - เพราะฉันคิดว่าเกมบนระบบฝังตัวใช้ประโยชน์จากการประกอบอย่างกว้างขวาง
คำตอบ:
คำตอบขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "เกม" และ "ใช้" ฉันจะถือว่า "ใช้" หมายถึง "เขียนในระหว่างโครงการเกมเฉพาะ"
จากประสบการณ์ของฉันและข้อมูลประวัติจากคนที่ฉันได้พูดคุยกับ:
ความรู้เกี่ยวกับภาษาแอสเซมบลีไม่ได้ถูกคาดหวังสำหรับการทำงานในอุตสาหกรรมเกม แต่ขึ้นอยู่กับประเภทของเกมที่คุณทำมันอาจมีประโยชน์
เคยมีข้อโต้แย้งว่าคอมไพเลอร์ทำงานได้ดีขึ้นในการเพิ่มประสิทธิภาพรหัส C กว่าที่มนุษย์จะใช้กับชุดประกอบที่เขียนด้วยมือ โดยปกติแล้วเป็นเรื่องจริงบางครั้งก็เป็นเรื่องผิด แต่ทุกวันนี้การรวมกันของความซับซ้อนของซีพียูที่เพิ่มมากขึ้นและความต้องการในการขยาย 'ออก' (เช่นการแยกโปรเซสเซอร์) หมายถึงการใช้ความพยายามในการปรับให้เหมาะสมที่สุดมักจะใช้ที่อื่น
ในช่วงไม่กี่ปีที่ผ่านมามีเพียงครั้งเดียวที่ฉันเห็นการชุมนุมในรหัสเกมคือ__asm int 3
ข้อความที่บังคับให้เบรกพอยต์และการใช้งานส่วนตัวของฉันเป็นการชุมนุมเพื่อดูการถอดการทำงานเพื่อวินิจฉัยข้อผิดพลาดที่ผิดปกติ
เป็นกลุ่มของรหัสที่มีประสิทธิภาพสูงในการเล่นเกมคอนโซลที่ทันสมัยเขียนโดยใช้การจัดเรียงของพื้นกลางระหว่างการชุมนุมและ C ++ A: intrinsics คอมไพเลอร์ โครงสร้างเหล่านี้มีลักษณะและแยกเช่น C ++ ฟังก์ชั่นแต่จะมีการแปลคำแนะนำจริงในเครื่องเดียว ตัวอย่างเช่นฟังก์ชัน "clamp แต่ละค่าเวกเตอร์ V เป็น> = a และ <= b" ของฉันดูเหมือน
// for each v.x, ensure v.x >= a.x && v.x <= b.x
inline __m128 ClampSIMD( const __m128 &v, const __m128 & a, const __m128 & b )
{
return _mm_max_ps( a, _mm_min_ps( v, b ) );
}
ในฟังก์ชั่นเช่นนี้ฉันยังคงคิดในแง่ของคำแนะนำเฉพาะเครื่องจักรแต่ฉันมีความสะดวกในการเขียนคำศัพท์เหล่านี้ใน C ดังนั้นฉันจึงไม่ต้องกังวลเกี่ยวกับการลงทะเบียนระบายสีและกำหนดเวลาและโหลด ops และรายละเอียดที่น่าเบื่ออื่น ๆ
คุณยังต้องระวังสิ่งที่คำแนะนำที่ซีพียูรองรับโดยเฉพาะอย่างยิ่งเนื่องจากคอมไพเลอร์สมัยใหม่นั้นแย่มากในการใช้รหัส vectorizing เมื่อเทียบกับมนุษย์อัจฉริยะที่สามารถทำงาน บางครั้งรายละเอียดที่ละเอียดอ่อนเกี่ยวกับวิธีการจัดเรียงรหัสของคุณอาจมีผลกระทบอย่างมากต่อประสิทธิภาพที่ไม่ชัดเจนโดยไม่เข้าใจว่าเครื่องกำลังทำอะไร
แม้ว่าเราจะไม่ใช้รหัสในการประกอบเรายังคงแก้ปัญหาในการชุมนุมจำนวนมาก การปรับแต่งคอมไพเลอร์อย่างหนักแน่นจัดระเบียบโค้ดใหม่ในวิธีที่ดีบั๊กไม่สามารถติดตามได้บ่อยครั้งเมื่อทำการดีบั๊ก "โหมดการเปิดตัว" สร้างสิ่งที่ดีที่สุดที่ต้องทำคือเปิดป๊อปแอสเซมเบลอร์ GDC นี้พูดคุยเกี่ยวกับ "การตรวจแก้จุดบกพร่องทางนิติวิทยาศาสตร์"ของการขัดข้องแสดงให้เห็นถึงสาเหตุและข้อบกพร่องในระดับนั้น
ปัญหาที่ต้องใช้ในการประกอบมือรีดมีจำนวนน้อยลง สิ่งที่คุณ "อาจ" ได้รับในความเร็วที่คุณสูญเสียในการอ่านและความสามารถในการแก้ปัญหา ควรทำเพียงหนึ่งในขั้นตอนการปรับให้เหมาะสมสุดท้ายในส่วนของโค้ดเนื่องจากในกรณีส่วนใหญ่ปัญหาเรื่องความเร็วไม่ใช่สิ่งที่ไม่สามารถทำได้ดีกว่าเมื่อใช้ชุดประกอบ ทุกวันนี้ซีพียูได้เร็วขึ้นมากในขณะที่ความเร็วหน่วยความจำไม่ได้บ่อยครั้งสิ่งสำคัญคือการควบคุมว่าข้อมูลไหลผ่านซีพียูมากกว่าสิ่งอื่นใด
ด้วยคอมไพเลอร์สมัยใหม่พวกเขายังพบว่ามันยากที่จะปรับให้เหมาะสมรอบ ๆ รหัสแอสเซมบลีเนื่องจากพวกเขาต้องจัดการกับสิ่งที่คุณสัมผัสและมักจะไม่สามารถสั่งซื้อซ้ำคำแนะนำในรหัสที่สร้างขึ้นด้วยมือของคุณ เพื่อลดความต้องการแอสเซมบลีขณะนี้มีอินทรินซึ่งช่วยในการเข้าถึงแนวคิดระดับต่ำ แต่ในวิธีที่คอมไพเลอร์เป็นมิตรและอนุญาตให้ทำงานกับคุณมากกว่ากับ
กับที่กล่าวว่า SPU บน PS3 ที่เป็นหนึ่งในพื้นที่ที่คนยังคงต้องใช้การชุมนุมที่จะได้รับประโยชน์สูงสุดจากการประมวลผลที่มีคู่มือการใช้งาน pipelining ตัวอย่างตามที่อธิบายไว้ที่นี่
ความจริงก็คือเราอาศัยอยู่ในโลกที่มีหลายแพลตฟอร์มและบางส่วนของรหัสเกมของเราต้องได้รับการปรับแต่งให้เข้ากับแพลตฟอร์มในท้องถิ่น - ไม่จำเป็นต้องมี แต่มีประโยชน์ถ้าเราใช้ประโยชน์จากฮาร์ดแวร์ในท้องถิ่น!
นี่ไม่เกี่ยวกับเกมหรือลอจิกเกม แต่เป็นเรื่องเกี่ยวกับตำแหน่งฮาร์ดแวร์เพื่อประสิทธิภาพที่ดีที่สุดของรหัสตามที่บานพับเกมลอจิกเราสามารถตัดส่วนรหัสได้อย่างแน่นอนตัวอย่างเช่นการใช้มาโครเช่นมีซอร์สโค้ดหนึ่งตัว แพลตฟอร์มมันถูกสร้างขึ้น