ฉันจะจัดการกับการเปลี่ยนแปลงเวอร์ชันเมื่อบันทึกเนื้อหาได้อย่างไร


9

ตอนนี้ฉันทำงานเป็น RPG มาระยะหนึ่งแล้วฉันใช้เทคนิคการทำให้เป็นอันดับสองแบบที่ต่างกัน

  • ศัตรูอาวุธรายการถูกบันทึกเป็น XML
  • แผนที่และกิจกรรมจะได้รับการบันทึกเป็น "ไบนารีที่ควบคุม" (ทุกคลาสจะได้รับวิธีการบันทึก / โหลดและพวกเขาเลือกสิ่งที่พวกเขาต้องการที่จะบันทึก / โหลด)

แต่ฉันเริ่มถามตัวเลือกของฉันสำหรับแผนที่และกิจกรรมต่างๆ ความกังวลของฉัน:

  • ฉันได้สร้างโปรแกรมแก้ไขแผนที่ แต่ฉันก็ยังพลาดที่จะเปลี่ยนสิ่งเล็ก ๆ น้อย ๆ เพียงแค่เปิดไฟล์
  • เปลี่ยนระเบียบมากขึ้น บอกว่าฉันต้องการเพิ่มตัวแปรให้คลาสถ้าฉันไม่โหลด / บันทึกทุกแผนที่อีกครั้งมันจะแตกภายหลัง

ข้อกังวลแรกนั้นยากที่จะแก้ไขโดยไม่ต้องเปลี่ยนเทคนิคของฉัน ฉันคิดว่าจะเปลี่ยนเป็น JSON แต่มันทำงานได้มากมาย ฉันคิดว่ามันดูน่าเกลียดด้วยแอตทริบิวต์ [DataContract] และ [DataMember] ทุกที่

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

คำตอบ:


5

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

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

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

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


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

ขั้นที่สองสมมติว่าคุณยังต้องการรูปแบบไบนารีสำหรับจัดส่งเกม (ซึ่งสามารถปรับปรุงขนาดไฟล์หรือเวลา IO ของไฟล์ได้ดังนั้นจึงเป็นความต้องการที่ถูกต้อง) ออกแบบ serialization และดีซีเรียลไลเซชัน API ของคุณเพื่อจัดการกับเวอร์ชัน รุ่นคือยังคงมีประโยชน์ในบริบทการจัดส่งสินค้าเพราะบางจุดที่คุณอาจต้องการการปรับปรุงเรือหรือแก้ไขข้อผิดพลาด มีเอกสารบางอย่างที่อธิบายความสามารถในการกำหนดเวอร์ชันของ. NET serializationและBoost ของอนุกรมที่คุณอาจพบว่าน่าสนใจ หากคุณกำลังจะให้การสนับสนุนทั้งข้อความและรูปแบบไบนารีให้แน่ใจว่าคุณทดสอบพวกเขาบางครั้ง (หรืออัตโนมัติสร้างการทดสอบจะทำเช่นนั้นได้ดียิ่งขึ้น)


ขอบคุณสำหรับความคิดเห็นทำให้ฉันมีความคิดวิธีการดำเนินการต่อ
user1776562

1

ใช้ภาษามาร์กอัปกับคู่ของค่าแอตทริบิวต์เช่น XML หรือ JSON

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

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

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

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


1

คุณสามารถใช้ protobuf https://code.google.com/p/protobuf/ มันให้ข้อดีของ json / xml ที่คุณสามารถขยายได้อย่างง่ายดายในขณะที่เข้ากันได้ย้อนหลังรวมถึงข้อดีของการเป็นไบนารี เวิร์กโฟลว์คือคุณสร้างคำอธิบายรูปแบบข้อมูลในภาษา protobuf จากนั้นสร้างซอร์สโค้ดสำหรับซีเรียลไลซ์เซชั่นและดีซีเรียลไลเซชัน สามารถสร้างแหล่งข้อมูลสำหรับหลายภาษา นอกจากนี้ยังเป็นข้อได้เปรียบที่ยิ่งใหญ่ที่คุณมีสเปคที่ชัดเจนของข้อมูลอนุกรมของคุณตรงกันข้ามกับ json ที่สเปคนั้นทำโดยปริยายในการอ่าน / เขียน


ดูดี แต่ฉันใช้ c # ดูเหมือนว่าจะเป็นสำหรับ c ++, python และ java
user1776562

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