ตกลงเพียงเพื่อกระตุ้นบางหลุมในคุยโวที่คุณเชื่อมโยง:
- "C # อาศัย 'Just In Time' ล่าม" - ผิด - มันเป็น JIT คอมไพเลอร์ หลังจากเมธอดคือ JITted หนึ่งครั้งโค้ดที่คอมไพล์จะถูกใช้ซ้ำสำหรับการเรียกใช้แต่ละครั้ง โค้ดที่คอมไพล์แล้วนั้นใกล้เคียงกับโค้ดที่คอมไพล์ก่อนโค้ด
- "Xenon CPU เป็นโปรเซสเซอร์" แบบแทนที่ " - เขาหมายถึง" ตามลำดับ "หรือไม่? - และ: "ซีนอน CPU มีการทำนายสาขา" เขาหมายถึงเหล่านี้หมายถึงการที่ JIT รวบรวมผลิตตามธรรมชาติรหัสที่ไม่ดีที่ต้องได้รับการสั่งซื้ออีกครั้งโดย CPU และทำให้เกิดการแตกแขนงจำนวนมาก - ซึ่งเป็นเรื่องไร้สาระแน่นอน คำแนะนำด้านประสิทธิภาพแบบเดียวกันสำหรับการทำงานบนสถาปัตยกรรมซีพียูนี้ใช้กับทั้ง C ++ และ C #
- "[JIT] ต้องล้างข้อมูลอย่างต่อเนื่องใน 360" - ผิดรหัสที่คอมไพล์สามารถเก็บไว้ในแคชได้เหมือนกับรหัสที่คอมไพล์ปกติ (ถ้าเขาหมายถึงไปป์ไลน์ให้ดูที่จุดด้านบน)
- "generics [... ] ใช้การสร้างรหัส" - generics นั้น JITted เหมือนทุกสิ่งทุกอย่างและเหมือนกับทุกสิ่งทุกอย่างรหัส JITted นั้นรวดเร็ว ไม่มีโทษประสิทธิภาพสำหรับการใช้ยาชื่อสามัญ
- "ภาษาที่เซ็กซี่ทั้งหมด [... ] จำเป็นต้องใช้การคาดคะเนสาขา ... " - สิ่งนี้ไม่สามารถใช้ได้กับ C ++ เช่นกัน? - "... หรือ [... ] การสร้างโค้ดแบบแทนที่" - เขาหมายถึง JITting หรือเปล่า ฉันพูดถึงว่ามันเร็วหรือไม่ (ฉันจะไม่เข้าไปในทุกที่ที่เดสก์ท็อป CLR ใช้การสร้างรหัสจริง - คุณลักษณะที่ไม่รองรับโดย Xbox 360!)
- "[C # ไม่มี] ห้องสมุดขนาดใหญ่ [ของ C ++]" - ยกเว้นพูด XNA เอง? และอื่น ๆ อีกมากมาย (ถึงกระนั้นนี่เป็นจุดที่ค่อนข้างยุติธรรม)
XNA บน Xbox 360 ทำงานบน CLR .NET .NET Framework รุ่นที่แก้ไข ฉันไม่สงสัยเลยว่ามันไม่ได้มาตรฐานของรุ่นเดสก์ท็อป JITter อาจไม่ดีเท่า - แต่ฉันไม่คิดว่ามันไม่ดีเช่นกัน ฉันประหลาดใจที่เขาไม่ได้พูดถึงตัวรวบรวมขยะที่น่ากลัวเมื่อเทียบกับเดสก์ท็อป CLR
(แน่นอน - คุณไม่ควรกดปุ่มเก็บขยะในเกมที่พัฒนาอย่างมืออาชีพอยู่ดีเหมือนกับที่คุณต้องระวังในการจัดสรรเกมระดับมืออาชีพใด ๆ )
(สำหรับการสนทนาทางเทคนิคที่แท้จริงของ. NET Compact Framework อาจเริ่มด้วยชุดบทความนี้: ภาพรวม , JIT Compiler , และGC และฮีป )
วิธีที่เขาไม่เฉพาะเจาะจงเกี่ยวกับคำศัพท์ของเขาทำให้ยากที่จะเข้าใจแม้กระทั่งสิ่งที่เขาหมายถึง ไม่ว่าเขาจะอยู่ในโหมดโวยวายสูงสุดหรือไม่รู้ว่าเขากำลังพูดถึงอะไร
ตอนนี้เรามีวิธีการที่นี่คือบางสิ่งที่คุณไม่ควรพลาดโดยใช้ XNA ใน 360 แทนที่จะไปพื้นเมือง :
- เข้าถึงหน่วย SIMD / Vector สำหรับการทำจริงๆ คณิตศาสตร์จุดลอยตัว CPU ที่รวดเร็วจริงๆ
- ความสามารถในการใช้รหัสภาษาพื้นเมืองที่อาจจะเร็วกว่า C # เล็กน้อย
- ความสามารถในการเป็น ขี้เกียจนิดหน่อยกับวิธีการจัดสรรหน่วยความจำ
- เกม XBLIG มีการเข้าถึงเพียง 4 ใน 6 คอร์ (แต่เรายังคงได้รับซีพียูทั้ง 3 ตัวและพวกเขาก็ไม่ได้เต็มคอร์เช่นกันดังนั้นเราจึงไม่พลาดมากนัก) - ไม่แน่ใจว่าสิ่งนี้ใช้กับ XBLIG XNA ที่ไม่ใช่ เกม
- การเข้าถึง DirectX เต็มรูปแบบสำหรับการใช้เล่ห์เหลี่ยมกราฟิกที่ไม่ชัดเจน
นอกจากนี้ยังมีค่าชี้ให้เห็นว่าสิ่งเหล่านี้เป็นข้อ จำกัด ด้าน CPU คุณยังสามารถใช้งาน GPU ได้ฟรีอย่างสมบูรณ์
ฉันอธิบายสิ่งเหล่านี้ในคำตอบนี้กับคำถามเดียวกันกับคำถามนี้อย่างมีประสิทธิภาพ ที่ผมกล่าวถึงในคำตอบที่XNA เป็นอย่างที่เหมาะสมสำหรับการพัฒนา
เหตุผลเดียวที่คุณหลีกเลี่ยงคือเพราะคุณไม่สามารถจ้าง C # พรสวรรค์, สิทธิ์ใช้งานเครื่องยนต์ C #, และนำรหัส C # ที่มีอยู่กลับมาใช้ใหม่ในลักษณะเดียวกับที่คุณสามารถทำได้ด้วยฐานความรู้ C ++ ที่มีอยู่ หรือเพราะคุณอาจกำลังกำหนดเป้าหมายแพลตฟอร์มที่ไม่สนับสนุน C #
แน่นอนสำหรับพวกเราหลายคนที่ไม่ใช่นักพัฒนา "มืออาชีพ" XNA เป็นตัวเลือกเดียวของเราที่จะได้รับบน Xbox 360 ทำให้เป็นจุดที่สงสัย
หากต้องการตอบคำถามอื่นของคุณ:
ไม่มีอะไรใน C # ที่จะหยุดคุณโดยใช้วิธีการที่เน้นข้อมูลในลักษณะเดียวกับที่คุณใช้ใน C ++
C # ขาดความสามารถในการใส่รหัสอินไลน์โดยอัตโนมัติในเวลารวบรวมและ (โดยไม่ต้องออกไปตรวจสอบ) ฉันค่อนข้างแน่ใจว่า JITter ของ CLR ขนาดกะทัดรัดไม่สามารถใช้วิธีการแบบอินไลน์ (CLR เดสก์ท็อปสามารถ) ดังนั้นสำหรับโค้ดที่มีประสิทธิภาพที่สำคัญคุณอาจต้องอินไลน์แบบแมนนวลใน C # ซึ่ง C ++ ให้ความช่วยเหลือบางอย่าง
อาจเป็นเหตุผลใหญ่กว่าที่ทำไมคุณไม่เห็น CPU-maths อย่างเข้มข้นเช่นการตรวจหาการชนกันของข้อมูลและการจำลองสถานการณ์ของไหลใน C # คือการไม่สามารถเข้าถึงหน่วยเวกเตอร์ (ดังกล่าวข้างต้น)