endianness น้อยและใหญ่ในเกม


16

เราต้องกังวลเกี่ยวกับคำสั่งไบต์ในการเขียนโปรแกรมเกมหรือไม่? คอนโซลเกมใช้คำสั่งไบต์ต่างกันหรือไม่?


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

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

1
เป็นการอ่านที่ดี แต่ Rob กำลังแสดงให้เห็นว่าคุณสามารถอ่านได้ง่ายขึ้นโดยมีค่าใช้จ่ายที่ต้องใช้การเขียนที่ซับซ้อนมากขึ้น หากคุณไม่ได้เป็นคนเขียนบทก็เยี่ยมเลย!
Kylotan

คำตอบ:


14

หากคุณกำลังเขียนรหัสเครือข่ายสิ่งนี้มักจะเป็นสิ่งที่คุณต้องจัดการใช่

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


8

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


5

ส่วนใหญ่ไม่มี

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

อย่างไรก็ตามหากคุณกำลังทำงานกับชิ้นส่วนระดับต่ำของเอนจิ้น C / C ++ หลายแพลตฟอร์มคุณอาจต้องจัดการกับมัน คอนโซลยุคปัจจุบันทั้งสามรุ่นใช้สถาปัตยกรรม PowerPC ซึ่งเป็นบิ๊ก - เอ็นด์ในขณะที่สถาปัตยกรรม x86 ที่ใช้บนพีซีนั้นเป็นเอนด์น้อย ดังนั้นถ้าคุณกำลังทำงานกับโค้ดที่อ่านไบต์ดิบจากที่อื่นเพื่อวางไว้ในโครงสร้างข้อมูล (การทำให้เป็นอนุกรมไบนารี, การสร้างเครือข่าย ... ), ใช่คุณจะต้องจัดการกับมัน

ตัวอย่างเช่นใน C / C ++ เป็นเรื่องปกติที่จะเห็นการดำเนินการสลับไบต์ชนิดนี้ (ไม่ผ่านการทดสอบการแก้ไขที่ให้การต้อนรับ):

// Assume bytes comes ordered as big-endian
u16 u16FromBytes(void* data)
{
#if BIG_ENDIAN
    return (u16(data[0]) << 8) + u16(data[1]);
#else // LITTLE_ENDIAN
    return (u16(data[1]) << 8) + u16(data[0]);
#endif
}

อีกครั้งนี่เป็น OK ในรหัสระดับต่ำ แต่สิ่งนี้ไม่ควรใช้ทุกที่


3

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

ในพื้นที่คอมพิวเตอร์ในบ้านนั้น "บิ๊ก 3" (Windows, Linux, Mac) ล้วน แต่เป็นเอกสิทธิ์หรือทั้งหมดยกเว้น แต่ในสถาปัตยกรรมของ Intel x86 / x64 ปัจจุบันความกังวลเรื่องความไม่ได้เกี่ยวข้องกันอีกต่อไป


ไม่มีความเกี่ยวข้องอีกต่อไปหรือ จากประสบการณ์ของฉัน (2-3 เกมทั่วทั้งสอง บริษัท และ 7 ปีทั้ง MMO ... ดังนั้นประวัติย่อแทนที่จะใช้ทางสถิติ) ตลาด PS และ Xbox แต่ละตลาดมีขนาดใหญ่กว่าตลาด windows สองเท่า Macs เป็นเพียงส่วนเล็ก ๆ ของ windows และ Linux มีขนาดเล็กลงอย่างเห็นได้ชัด หากเกมของคุณไม่สามารถทำงานบนคอนโซลได้คุณจะเหลือกำไร 80% ของคุณบนพื้นดินโดยการเกาะติดกับพีซี รหัส Cross-endian ยังหมายความว่าเซิร์ฟเวอร์ของคุณสามารถใช้งานบนเครื่องที่แตกต่างจากเครื่องไคลเอนต์ของคุณได้อย่างสมบูรณ์ (เช่นเกมคอนโซลของลูกค้า - เซิร์ฟเวอร์ทุกเครื่อง)
Mark Storer

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