มีการใช้งานการประกอบเท่าไหร่ในรหัสเกมสมัยใหม่ [ปิด]


21

โดยเฉลี่ยแล้วแอสเซมบลีที่ใช้ในรหัสเกมสมัยใหม่บ่อยแค่ไหน?

โดยเฉพาะบนแพลตฟอร์มที่มีคอมไพเลอร์ C ++ ที่ดีอยู่แล้วเช่น x86, PPC หรือ ARM - เพราะฉันคิดว่าเกมบนระบบฝังตัวใช้ประโยชน์จากการประกอบอย่างกว้างขวาง


4
C ++ ไม่คอมไพล์ไปยังแอสเซมบลี - มันคอมไพล์ไปยังรหัสเครื่อง ภาษาแอสเซมบลีเป็นวิธีการระบุโดยตรงว่าคุณต้องการสร้างรหัสเครื่องใด
Kylotan

6
C ++ คือ (โดยทั่วไป) ไม่ได้คอมไพล์กับแอสเซมบลีจริง ๆ มันจะคอมไพล์โดยตรงกับรหัสเครื่อง คำถามอาจหมายถึงจำนวนชุดที่เขียนด้วยมือเชื่อมโยงกับโครงการหรือเขียนเป็นชุดประกอบแบบอินไลน์

1
ฉันไม่คิดว่าจะมีคำตอบที่เป็นประโยชน์และมีประโยชน์สำหรับคำถามนี้ โดยพื้นฐานแล้วมันขึ้นอยู่กับปัจจัยหลายอย่างซึ่งเป็นอัตวิสัย (เช่นความคิดเห็นของผู้เขียนรหัส)

1
ชุดการเขียนไม่มากมีความสำคัญในทุกวันนี้มีข้อยกเว้นบางอย่างเช่นการเขียนโปรแกรม SPU แต่ความสามารถในการอ่านเป็นสิ่งสำคัญสำหรับการวิเคราะห์ทิ้งความผิดพลาด
Maik Semder

4
@Legion - คุณสามารถทำให้คอมไพเลอร์ / IDE ปล่อยแอสเซมบลี แต่นั่นไม่ได้หมายความว่าคอมไพเลอร์สร้างแอสเซมบลีเป็นส่วนหนึ่งของกระบวนการคอมไพล์ปกติ มันไม่จำเป็นสำหรับมันที่จะทำเช่นนั้นและดังนั้นส่วนใหญ่ทำไม่ได้

คำตอบ:


29

คำตอบขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "เกม" และ "ใช้" ฉันจะถือว่า "ใช้" หมายถึง "เขียนในระหว่างโครงการเกมเฉพาะ"

จากประสบการณ์ของฉันและข้อมูลประวัติจากคนที่ฉันได้พูดคุยกับ:

  • ในเกมที่ใช้เบราว์เซอร์? ไม่มี.
  • ในเกมพีซีทั่วไปหรือไม่ ไม่มี. (แต่คุณอาจเห็นบางอย่างในไลบรารีระดับต่ำ)
  • ในเกม iOS และ Android? ไม่มี.
  • เกมพีซีและเกมคอนโซล "AAA" อาจจะเล็กน้อยอาจ 0.05% ของรหัสฐาน (มีอีกเล็กน้อยในห้องสมุด)

ความรู้เกี่ยวกับภาษาแอสเซมบลีไม่ได้ถูกคาดหวังสำหรับการทำงานในอุตสาหกรรมเกม แต่ขึ้นอยู่กับประเภทของเกมที่คุณทำมันอาจมีประโยชน์

เคยมีข้อโต้แย้งว่าคอมไพเลอร์ทำงานได้ดีขึ้นในการเพิ่มประสิทธิภาพรหัส C กว่าที่มนุษย์จะใช้กับชุดประกอบที่เขียนด้วยมือ โดยปกติแล้วเป็นเรื่องจริงบางครั้งก็เป็นเรื่องผิด แต่ทุกวันนี้การรวมกันของความซับซ้อนของซีพียูที่เพิ่มมากขึ้นและความต้องการในการขยาย 'ออก' (เช่นการแยกโปรเซสเซอร์) หมายถึงการใช้ความพยายามในการปรับให้เหมาะสมที่สุดมักจะใช้ที่อื่น

ในช่วงไม่กี่ปีที่ผ่านมามีเพียงครั้งเดียวที่ฉันเห็นการชุมนุมในรหัสเกมคือ__asm int 3ข้อความที่บังคับให้เบรกพอยต์และการใช้งานส่วนตัวของฉันเป็นการชุมนุมเพื่อดูการถอดการทำงานเพื่อวินิจฉัยข้อผิดพลาดที่ผิดปกติ


1
คำแนะนำเกี่ยวกับ SSE คืออะไร
Legion

4
@Legion คนมักจะเขียนรหัส SSE ใช้ intrinsics อย่างใดอย่างหนึ่งหรือห้องสมุดคณิตศาสตร์ที่ห่อสิ่ง SSE หรือในมินิภาษาที่มีความเชี่ยวชาญการออกแบบเฉพาะเพื่อรวบรวม SSE เช่นIspc การเขียนชุดประกอบโดยตรงยังคงค่อนข้างหายาก
นาธานรีด

1
เกี่ยวกับเกม iOS: ถ้าฉันจำได้ถูกต้องห้องสมุด 3D / Math Oolong ใช้แอสเซมบลี ARM แบบอินไลน์ ไม่จำเป็นอีกต่อไปเนื่องจาก Apple เปิดตัวกรอบการทำงานเร่งความเร็ว
Nicolas Miari

เห็นด้วยกับนาธาน - SSE และการเพิ่มประสิทธิภาพเฉพาะการเรียนการสอนที่คล้ายกันมักจะอยู่ในห้องสมุด (เพราะพวกเขามักจะเป็นสถานที่เดียวที่ได้รับผลประโยชน์รวมมีมูลค่าความพยายามใส่)
Kylotan

26

เป็นกลุ่มของรหัสที่มีประสิทธิภาพสูงในการเล่นเกมคอนโซลที่ทันสมัยเขียนโดยใช้การจัดเรียงของพื้นกลางระหว่างการชุมนุมและ 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 นี้พูดคุยเกี่ยวกับ "การตรวจแก้จุดบกพร่องทางนิติวิทยาศาสตร์"ของการขัดข้องแสดงให้เห็นถึงสาเหตุและข้อบกพร่องในระดับนั้น


3
+1 เพียงเพราะ Crashworks เป็นที่รู้จักกันดีในฐานะ"คนที่เขียนโค้ดที่เหมาะสำหรับเกม" - ถ้ามีใครรู้เกี่ยวกับหัวข้อนี้
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft "รู้จักกันดี"? ฉันภูมิใจ! =) ความบังเอิญที่น่าขบขันในแง่ของความคิดเห็นของ Nathan Reed คือฉันได้เรียนรู้ทักษะการเพิ่มประสิทธิภาพระดับต่ำจำนวนมากของ Naughty Dog
Crashworks

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

7

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

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

กับที่กล่าวว่า SPU บน PS3 ที่เป็นหนึ่งในพื้นที่ที่คนยังคงต้องใช้การชุมนุมที่จะได้รับประโยชน์สูงสุดจากการประมวลผลที่มีคู่มือการใช้งาน pipelining ตัวอย่างตามที่อธิบายไว้ที่นี่


1
แม้บน PS3 คนมักจะทำไม่ได้ค่อนข้างโปรแกรมในการชุมนุมเปลือย มีเครื่องมือที่ให้คุณเขียนโค้ดในรูปแบบแอสเซมบลีซึ่งคุณระบุคำสั่งเครื่องได้ แต่จะทำการจัดสรรการลงทะเบียนการกำหนดเวลาคำสั่งและการวางท่อแบบวนซ้ำสำหรับคุณ เอาละ Naughty Dog อาจจะทำได้ด้วยมือจริง ๆ แต่แม้แต่นักพัฒนา PS3 SPU ส่วนใหญ่ก็ไม่ได้อยู่ในประสบการณ์ของฉัน :)
นาธานรีด

1
@NathanReed ในวัน PS2 การวางท่อลูปด้วยตนเองเป็นส่วนหนึ่งของการสัมภาษณ์โปรแกรมเมอร์ของ Naughty Dog
Crashworks

-1

ความจริงก็คือเราอาศัยอยู่ในโลกที่มีหลายแพลตฟอร์มและบางส่วนของรหัสเกมของเราต้องได้รับการปรับแต่งให้เข้ากับแพลตฟอร์มในท้องถิ่น - ไม่จำเป็นต้องมี แต่มีประโยชน์ถ้าเราใช้ประโยชน์จากฮาร์ดแวร์ในท้องถิ่น!

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.