รูปแบบไฟล์ที่ดีสำหรับการบันทึกข้อมูลเกมคืออะไร [ปิด]


37

ฉันต้องการบันทึกข้อมูลเกมที่กำหนดเอง แผนที่ผู้เล่น ฯลฯ

พวกเขาทั้งหมดจะมี "วัตถุย่อย" ตัวอย่างเช่นแผนที่และแผนที่จะมี "อาร์เรย์" ของไทล์ เช่นข้อมูลลำดับชั้น หวังว่าไม่มีอะไรไบนารี

อะไรคือรูปแบบที่ดีสำหรับสิ่งเหล่านี้

จนถึงตอนนี้ฉันก็ถือว่า:

Serailization:นี่คือเร็วและง่าย แต่มีแนวโน้มที่จะแตกเมื่อฉันเปลี่ยนคลาสพื้นฐาน :(

XML:ฉันเกลียดการแยกวิเคราะห์สิ่งนี้จริงๆ กรณีทดสอบของฉันมีโค้ดมากกว่า 100 บรรทัดและดูเหมือนว่า "งานที่ยุ่ง" มากมายสำหรับรูปแบบที่เรียบง่ายมาก

INI:จะค่อนข้างซุ่มซ่ามสำหรับข้อมูลลำดับชั้น

Protobuf:ไม่เคยใช้ แต่อ่านว่าคุณต้องทำเยอะแยะไปหมดและทำลายถ้าคุณเปลี่ยนชั้นเรียน

ตัวเลือกอื่น? นั่นคือเหตุผลที่ฉันมาที่นี่!

แก้ไข: นี่คือ Java btw

แก้ไข 2:

ฉันตัดสินที่ "การทำให้เป็นอันดับไบนารีควบคุม" (ดูด้านล่าง)

ข้อดี:

  • มันรวดเร็ว

  • มันมีขนาดเล็ก (บนดิสก์) และสามารถบีบอัด / คลายการบีบอัดได้อย่างง่ายดายระหว่างอ่าน / เขียน

  • มันง่ายมากที่จะอ่าน / เขียนจากเกมและชุดเครื่องมือ

  • ฉันสามารถตัดสินใจว่าจะรวม / ไม่รวมวัตถุ

  • วัตถุ / ข้อมูลสามารถซ้อนกันได้

จุดด้อย:

  • ไม่สามารถแก้ไขด้วยมือ (เช่น XML, YAML, ฯลฯ )

  • ไม่สามารถอ่าน / แก้ไขได้อย่างง่ายดายด้วยสคริปต์

  • Java Serialization เป็นค่าเริ่มต้นค่อนข้างช้า / บวมเมื่อเทียบกับ implentations อื่น ๆ แต่มีเสถียรภาพและใช้งานได้


3
ค่าที่คั่นด้วยเครื่องหมายจุลภาค
Thomas Eding

@trinithis KISS เป็นสิ่งที่ดี
เนท

3
อย่าตกหลุมพรางที่คิดว่าการแยกวิเคราะห์ CSV เป็นเรื่องง่าย: secretgeek.net/csv_trouble.asp
Tetrad

ตลก ProtoBuf ถูกสร้างขึ้นเพื่อรองรับการอัพเกรด
Jonathan Dickinson

ini สำหรับทุกสิ่งที่ผู้ใช้แก้ไขได้เช่นการตั้งค่า ฯลฯ และไบนารีสำหรับทุกสิ่ง
UğurGümüşhan

คำตอบ:


38

หากต้องการแสดงข้อมูลแบบลำดับขั้นYAML หรือJSONจะเป็นตัวเลือกที่ดี พวกเขาจะไกลง่ายและง่ายต่อการแยกกว่า XML

ตัวเลือกอื่นจะเป็นกระบวนการไบนารีที่ "ควบคุม" วัตถุทุกชิ้นเขียนว่าเป็นสภาวะที่ควบคุมได้เช่น

void player::save(savegame &sgm)
{
    sgm.write(this->position);
    sgm.write(other properties);
    inventory.save(sgm);
}

id Tech 4 (เครื่องมือ Quake 4 / Doom 3) ใช้วิธีการดังกล่าว


+1 สำหรับการควบคุมซีเรียลไลซ์เซชั่นแบบไบนารี ฉันใช้สิ่งนี้ในที่ทำงานและเยี่ยมมาก!
NoobsArePeople2

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

ฉันใช้สิ่งนี้ในเกมของฉัน มันใช้งานได้ดี! ฉันใช้จาวา แต่ละวัตถุมีเมธอด ToByteStream ที่เขียนไปยังสตรีมไฟล์และตัวสร้างที่อ่านจากสตรีมไฟล์ ฉันไม่ชอบการใช้ Javas Serializable
MichaelHouse

4
หรือคุณสามารถใช้ Boost.Serialize และรับคุณสมบัติที่ยอดเยี่ยมเช่นการกำหนดเวอร์ชันเป็นต้น
Nicol Bolas

@ อิซกะตะฉันทำชื่อนั้นขึ้นมาเพราะไม่รู้ว่าวิธีนี้เรียกว่าอะไร
Raphael R.

9

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

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

ระบุปัญหาเหล่านี้ออกแบบรูปแบบของคุณโดยคำนึงถึงสิ่งเหล่านั้นและคุณสามารถสร้างรูปแบบไบนารีที่ยอดเยี่ยม

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


6

รูปแบบไฟล์ที่คุณเลือกขึ้นอยู่กับชุดเครื่องมือปัจจุบันของคุณและเกมที่คุณตั้งใจจะทำ ด้วยที่กล่าวว่า ...

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

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

เกม. คุณทำเกมประเภทใด ทำไมฉันถึงบอกว่าสิ่งนี้จะส่งผลกระทบต่อรูปแบบไฟล์? เพราะถ้าคุณทำสิ่งที่ชอบเครื่องบินทิ้งระเบิด 2D คุณสามารถออกไปกับไฟล์ข้อความง่ายๆเช่น:

*********
*1     2*    1,2,3,4  - start point of players 1, 2, 3, 4
* + + + *    *        - walls
*       *    +        - crates
* + + + *
*3     4*
*********

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

  • แผนที่อนุภาคและสิ่งกราฟิกอื่น ๆมักจะใช้รูปแบบไบนารีที่กำหนดเอง เพราะมันเป็นวิธีที่ง่ายที่สุดที่จะใช้มัน มันไม่ใช่มนุษย์ธรรมดาที่จะอธิบายแผนที่ที่เป็นข้อความ มักจะแก้ไขผ่านตัวแก้ไขแผนที่ / ระดับ / อนุภาค
  • ผู้เล่น, รายการ, ศัตรู, ทักษะและเควสมีสถิติที่มีผลต่อความสมดุลของเกม พวกเขามักจะต้องป้อนข้อมูลและ tweaking มากมาย ฉันชอบทำสิ่งนี้โดยวางไว้ในไฟล์ XML เพื่อความสะดวกในการนำไปใช้ แต่ยังมีตัวแก้ไขวัตถุเพื่อให้นักออกแบบเล่นด้วย ที่ดีที่สุดของโลกทั้งสอง

โดยทั่วไปคุณต้องการอธิบายข้อความด้วยรูปแบบข้อความและกราฟิกที่มีรูปแบบไบนารี ต่อไปนี้เป็นตัวอย่างให้คุณ:

<Skill>
    <Name>Fireball</Name>
    <Animation>fireball.dat</Animation> <!-- Graphics described in another file -->
    <Attack>1.3</Attack>
    <Cooldown>15</Cooldown>
</Skill>

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

ไชโย roy =)


5

BSON ค่อนข้างดี http://bsonspec.org/ มันง่ายกว่าที่จะแยกวิเคราะห์แล้ว JSON และดีกว่าที่มีข้อมูลไบนารี แต่ก็ยังมีโครงสร้างที่ดี มันค่อนข้างคล้ายกับบัฟเฟอร์โปรโตคอล ข้อเสียคือมีปริมาณ dosent ดูเหมือนจะสนับสนุนเครื่องมือมากมายนอกเหนือจาก mongodb

แก้ไข: MsgPack ( http://msgpack.org/ ) ก็คล้ายกับ BSON และดูเหมือนว่าจะดึงดูดมากขึ้น


1
ในขณะที่ฉันคิดว่าแนวคิดของ "JSON แบบไบนารี" เป็นสิ่งที่ดีฉันมีความเชื่อมั่นใน BSON น้อย แต่มีชนิดข้อมูล (ซ้ำซ้อน) มากเกินไปและเอกสารประกอบจะแย่มาก
aaaaaaaaaaaa

2

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


1

คุณสามารถผสม XML หรือรูปแบบอื่นด้วยการแทรก Base64 สำหรับข้อมูลเฉพาะบางอย่างและสำหรับเขตข้อมูลที่คุณต้องการให้สามารถอ่านได้คุณสามารถใช้ TEXT ปกติได้

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