XNA และ C # เทียบกับหน่วยประมวลผลกลางของ 360


14

หลังจากที่ได้อ่านคำพูดนี้ฉันรู้สึกว่ามันน่าจะถูก (เพราะ Xenon และ CELL BE นั้นมีความไวสูงต่อการแตกแขนงและโค้ดที่ไม่รู้แคช ) แต่ฉันได้ยินมาว่าผู้คนกำลังเล่นเกมกับ C # เช่นกัน

ดังนั้นมันเป็นความจริงหรือที่เป็นไปไม่ได้ที่จะทำสิ่งใดกับ XNA อย่างมืออาชีพหรือโปสเตอร์หายไปสิ่งที่ทำให้ XNA นั้นเป็น killer API สำหรับการพัฒนาเกม

โดยมืออาชีพฉันไม่ได้หมายถึงในแง่ที่ว่าคุณสามารถสร้างรายได้จากมัน แต่ในแง่ที่ว่าเกมระดับมืออาชีพมากขึ้นมีรูปแบบ phsyics และระบบภาพเคลื่อนไหวที่ดูเหมือนจะไม่สามารถเข้าถึงภาษาได้ด้วยอุปสรรคที่ชัดเจนสำหรับอินทริน . ถ้าฉันต้องการเขียนระบบการชนหรือเครื่องยนต์พลศาสตร์ของไหลสำหรับเกมของฉันฉันไม่รู้สึกว่า C # ให้โอกาสฉันทำเช่นนั้นในฐานะตัวสร้างโค้ดรันไทม์และการขาดความสามารถในการทำงาน

อย่างไรก็ตามคนจำนวนมากดูเหมือนจะทำงานได้ดีภายใต้ข้อ จำกัด เหล่านี้ทำให้เกมที่ประสบความสำเร็จ แต่ดูเหมือนจะหลีกเลี่ยงปัญหาใด ๆ โดยการละเลย ฉันไม่ได้สังเกตเห็นเกม XNA ใด ๆ ที่ทำอะไรที่ซับซ้อนมากกว่าสิ่งที่ห้องสมุดให้ไว้แล้ว คือการหลีกเลี่ยงการเปลี่ยนแปลงเกมที่ซับซ้อนมากขึ้นเพราะเต๋นี้ข้อ จำกัด ของ C #หรือคนก็มุ่งเน้นที่การได้รับมันทำ ?

ในความซื่อสัตย์ทั้งหมดฉันไม่อยากจะเชื่อว่าสงคราม AI สามารถรักษา AI หลายหน่วยโดยไม่ต้องใช้วิธีการที่มุ่งเน้นข้อมูลหรือแฮ็ก C # แฮ็กที่จะทำให้มันทำงานได้ดีกว่าวิธีมาตรฐานและฉันคิดว่านั่นเป็นคำถามของฉัน มีคนแฮ็ค C # ดังนั้นจึงสามารถทำสิ่งที่เกมตัวแปลงสัญญาณทำตามธรรมชาติด้วย C ++?


พูดจาโผงผางอย่างแน่นอน ไม่พบข้อมูลใด ๆ เกี่ยวกับผู้ชายและเห็นพวกเขากำลัง (เขา?) เริ่มต้นผมต้องการที่จะเห็นชนิดของข้อมูลใด ๆ ที่เห็นได้ชัดในการสำรองนี้ ...
โจนาธานคอนเนลล์

ด้วยเหตุผลที่ฉันไม่เข้าใจสตูดิโออย่างเต็มที่ดูเหมือนจะไม่ยอมรับ XNA อย่างไรก็ตามมีตัวอย่างมากมายที่นี่ลิงก์
Tristan Warner-Smith

ข้อมูลที่ชัดเจนในการแบ็คอัพคือความจริงที่ว่าซีพียูนั้นค่อนข้างแย่ที่รหัส branchy ซึ่ง C # คือ สิ่งที่ฉันอยากรู้คือผู้ใช้ XNA มืออาชีพทำอะไรนั่นหมายความว่าพวกเขาไม่ถึงขีด จำกัด ที่กำหนดโดย C #
Richard Fabian

3
ฉันไม่เข้าใจคะแนนเสียงลง ...
FxIII

3
ฉันคิดว่าผู้คนจำนวนมากกำลัง downvoting คำถามของริชาร์ดเนื่องจากความผิดพลาดทางเทคนิค (มากมาย) ในบทความที่เชื่อมโยงของเขาและบางคนก็งุนงงกับคำว่า "มืออาชีพ" เพื่อหมายถึง "การผลิตในระดับ Halo" แทน "ทำเงิน" ตัวเลือกหลังเป็นตัวเลือกที่ไม่ดี แต่อย่า downvote เพียงเพราะคุณไม่เห็นด้วยกับลิงก์ - debunk โดยตอบกลับแทน

คำตอบ:


21

ตกลงเพียงเพื่อกระตุ้นบางหลุมในคุยโวที่คุณเชื่อมโยง:

  • "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 # คือการไม่สามารถเข้าถึงหน่วยเวกเตอร์ (ดังกล่าวข้างต้น)


ฉันจำไม่ได้ แต่ C # ไม่หยุดย้ำให้คุณทำซ้ำอาร์เรย์ง่ายๆ ฉันจำบางสิ่งเกี่ยวกับมันได้มวยประเภทเฟิร์สคลาสเช่น int, float, char และด้วยเหตุนี้วิธีการที่มุ่งเน้นข้อมูลบางอย่างจึงไม่ทำงานอย่างรวดเร็วเท่าที่ควร นั่นถูกต้องใช่ไหม? ฉันจำอะไรได้บ้าง
Richard Fabian

2
C # จะใส่ค่าในกล่อง (ไม่ใช่แค่ในตัวเครื่อง - คุณสามารถสร้างประเภทค่าของคุณเองได้) หากคุณกำหนดให้objectประเภท และในรุ่นที่ 1 (ก่อน generics) คุณไม่สามารถใส่มันลงในคอนเทนเนอร์ที่ไม่ใช้อาร์เรย์ แต่ทุกวันนี้มันง่ายมากที่จะเขียนโค้ดที่ไม่มีกล่อง และ CLR Profiler ช่วยให้คุณตรวจจับสถานที่ใด ๆ ที่คุณอาจจะชกมวย
Andrew Russell

เป็นไปได้ไหมที่จะมีล่าม JIT? ฟังดูขัดแย้ง
The Duck คอมมิวนิสต์

ฉันเห็นเทคนิคโค้ดแบบเกลียวสองสามข้อฉันจะจัดว่าเป็นการตีความ JIT เป็นกรณีที่แน่นอน

1
@Roy T. " XNA Math Library " (ส่วนหนึ่งของ DirectX) และ " XNA Framework " เป็นสองสิ่งที่แตกต่างอย่างสิ้นเชิงกับการชนกันของชื่อที่โชคร้าย เอกสารที่คุณเชื่อมโยงใช้ไม่ได้กับ XNA Framework XNA Framework ของคณิตศาสตร์ประเภทไม่ได้ใช้หน่วย
Andrew Russell

5

คุณต้องกำหนด 'มืออาชีพ' คุณสามารถทำ Angry Birds, Plants vs Zombies และอื่น ๆ ได้ไหม? อย่างแน่นอน คุณสามารถทำ Crysis 2, COD, Halo ได้ไหม ฉันสงสัยมัน. การใช้ C # จะส่งผลกระทบต่อเกมที่มี CPU มากและต้องบีบหน่วยความจำทุกไบต์ (คุณสูญเสียไปกับการรวบรวมขยะ) ดังนั้นจึงมีจำนวนมากที่คุณสามารถทำได้

เป็นเครื่องมือการเรียนรู้สำหรับผู้ที่เริ่มต้นเครื่องมือสร้างต้นแบบแพลตฟอร์มสำหรับการเขียนเกมที่สามารถจัดการกับการแลกเปลี่ยน ฯลฯ มันยอดเยี่ยมและมีพลังและความเรียบง่ายมากมายมันไม่ได้ออกแบบมาเพื่อทำสิ่งที่คุณต้องการ เรียกเกม 'AAA' นอกจากนี้ยังนำไปสู่ความเจ็บปวดและความทุกข์ทรมานมากมายที่ผู้คนต้องกังวลเกี่ยวกับพอร์ตข้ามแพลตฟอร์ม

หากคุณพบกับเกมที่น่าทึ่งและคุณพบข้อ จำกัด ของสิ่งที่คุณสามารถทำได้กับ XNA ฉันขอแนะนำให้ติดต่อ MS โดยตรงหากความคิดนั้นดีพอจริง ๆ พวกเขาอาจแค่ปล่อยให้คุณได้พัฒนาเต็มที่ ชุด.


คุณสามารถสร้างภาคต่อของ Duke Nukem เส็งเคร็งได้ไหม? ;)
Jonathan Connell

1
การวัดประสิทธิภาพส่วนใหญ่พบว่ารหัส C # ทำงานที่ใดที่หนึ่งระหว่าง 30% ถึง 70% ช้ากว่ารหัส C ที่เทียบเท่า (บนพีซี) เมื่อคุณพิจารณาว่าเกมส่วนใหญ่ไม่ได้ผูกกับ CPU และส่วนที่สำคัญของรหัส C # สามารถเขียนได้โดยใช้รหัสที่ไม่ปลอดภัยที่สามารถเรียกใช้เกือบจะเร็วหรือเร็วกว่ารหัส C ที่เทียบเท่า(เร็วกว่าเพราะ JIT มีข้อมูลเพิ่มเติมมากมาย มันเป็นคอมไพเลอร์ดังนั้นจึงสามารถสร้างตัวเลือกการเพิ่มประสิทธิภาพที่ดีกว่า)คุณจะเห็นว่า C # นั้นสมบูรณ์แบบสำหรับเกม AAA
BlueRaja - Danny Pflughoeft

@BlueRaja: รหัสที่ไม่ปลอดภัยไม่ใช่ตัวเลือกสำหรับการพัฒนา XNA ส่วนใหญ่ใน Xbox 360

1
@BlueRaja: มันคุ้มค่าที่จะชี้ให้เห็นว่าunsafeรหัสนั้นมักจะช้ากว่าความปลอดภัยที่เทียบเท่าเพราะมันจะช่วยลดจำนวนของการเพิ่มประสิทธิภาพที่ CLR สามารถทำได้ คุณต้องวัดมัน
Andrew Russell

2
@Blueraja "เมื่อคุณพิจารณาว่าเกมส่วนใหญ่ไม่ได้มีข้อ จำกัด เกี่ยวกับ CPU" จำเป็นต้องใช้มาก? ฉันไม่ได้ทำงานในเกมที่พัฒนาอย่างมืออาชีพซึ่งไม่ได้ จำกัด อยู่ในทุกแกน หากเราไม่พบวิธีที่จะเปลี่ยนภาระไปยังส่วนนั้นของเครื่อง!
Richard Fabian

3

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

เกมมืออาชีพที่มากขึ้นมีโมเดลจำลองและระบบภาพเคลื่อนไหว

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


1
จำนวนรูปหลายเหลี่ยมสูงและ HDR จะตกบนการ์ดกราฟิกใช่ไหม ดังนั้นคุณควรคาดหวังประสิทธิภาพเดียวกันใน C # และ C ++
BlueRaja - Danny Pflughoeft

@BlueRaja: มีค่าใช้จ่าย CPU สำหรับเหล่านั้นด้วยและหน่วยความจำ - โดยเฉพาะอย่างยิ่งใน 360.
DeadMG

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