จะเป็นการดีกว่าถ้าใช้ XML / JSON / Text หรือฐานข้อมูลเพื่อจัดเก็บเนื้อหาของเกม


29

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

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

ประสิทธิภาพการทำงานที่ชาญฉลาดฉันคิดว่า XML โดยทั่วไปจะเร็วกว่าสำหรับไฟล์ขนาดเล็ก ฉันคิดว่าเกมจริง ๆ จะมีวัตถุในเกมมากมาย

ดังนั้นคำถาม: วิธีใดดีกว่า ฉันเอนหลังไปยังฐานข้อมูล แต่ฉันต้องการที่จะรู้ว่ามีข้อผิดพลาดที่ซ่อนอยู่หรือข้อได้เปรียบที่แข็งแกร่งจริงกับไฟล์ข้อความ หรือหากมีทางเลือกอื่นนอกเหนือจากนี้ (เป็นรูปแบบไบนารี่เป็นรูปแบบไบนารีฉันเดา?)

คำตอบ:


18

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


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

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

1
มันจะช่วยได้อย่างไร การใช้โปรแกรมแก้ไขที่กำหนดเองแล้วส่งออกไปยังไฟล์ข้อความจริง ๆ แล้วให้ส่วนที่เลวร้ายที่สุดของแต่ละตัวเลือก :-P
coderanger

7

JSON นั้นมีน้ำหนักเบาและเข้าใจง่ายมาก ฉันคิดว่ามันเหมาะกว่าสำหรับเกม cJSON ดีจริงๆ มันจะรวมอยู่ในแหล่งที่มาของคุณในลักษณะเดียวกับที่ SQLlite ทำ

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


ฉันไม่เคยดู JSON มากเท่าที่ฉันมีความสุขกับ XML (มันจะง่ายกว่านี้จริงๆ) .. ปรากฎว่า JSON นั้นน่าอัศจรรย์มาก ... แต่อย่าง XML ไม่แน่ใจว่ามันจะทำงานได้อย่างไรถ้ามันเป็นอย่างนั้น ข้อมูลหนัก
Spooks

7

ฉันมาสายปาร์ตี้ที่นี่ แต่ฉันใช้เวลาไปกับการค้นคว้าสิ่งนี้มาก

ก่อนอื่นทำไมฉันไม่ใช้สิ่งต่อไปนี้:

XML: verbose มากเกินไป ตันซ้ำซ้อน ทำซ้ำชื่อฟิลด์? GROSS

JSON:ฉันคิดว่า JSON นั้นยอดเยี่ยมสำหรับเลย์เอาต์ UI แต่สำหรับฐานข้อมูลก็ไม่เป็นไร มันจะมีปัญหาเช่นเดียวกับ XML, ความซ้ำซ้อนและการซ้อนแบบลึก GROSS

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

สุดท้ายนี่คือทางออกที่ฉันเลือกใช้ (และฉันชอบมาก)

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

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

จากนั้นคุณต้องแยกวิเคราะห์ไฟล์ CSV ในเกมของคุณ ฉันใช้ Unity ดังนั้นสิ่งที่ฉันต้องทำคือใช้โปรแกรมแยกวิเคราะห์ C # CSV ที่ดีที่ฉันพบ:

ตัวอย่างตัวแยกวิเคราะห์ CSV

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


6

คำตอบนี้ขึ้นอยู่กับภาษาที่คุณใช้สำหรับเกม

หากคุณกำลังใช้ C ++ คุณควรได้รับการแนะนำให้ใช้หนึ่งในไลบรารี XML ที่มีอยู่ (เช่นTinyXmlหรือeXpat )

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

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

ในระยะสั้นขึ้นอยู่กับสิ่งที่สามารถใช้งานได้ง่ายในภาษาของคุณ


1
ปัญหาในการใช้งานฐานข้อมูลจาก C ++ คืออะไร
Budda

2

หากคุณต้องการอยู่ในขอบเขตของสิ่งต่าง ๆ คุณสามารถใช้Binary XMLเพื่อช่วยเพิ่มประสิทธิภาพการโหลด

ตัวอย่างFast Infosetคือการนำไปใช้ของไบนารี xml

ใคร ๆ ก็นึกถึง Fast Infoset เป็น gzip สำหรับ XML แต่ FI มีเป้าหมายเพื่อเพิ่มประสิทธิภาพทั้งขนาดเอกสารและประสิทธิภาพการประมวลผลในขณะที่ gzip ปรับขนาดให้เหมาะสมเท่านั้น ในขณะที่การจัดรูปแบบเดิมจะหายไปไม่มีข้อมูลสูญหายในการแปลงจาก XML เป็น FI และกลับไปเป็น XML


แม้ว่าอาจไม่ใช่สิ่งที่ฉันจะใช้ (ฉันพิง JSON ผ่าน XML) ฉันขอขอบคุณลิงก์
CodexArcanum

1

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

แนวคิดเดียวกันเกิดขึ้นที่นี่ ฉันมีส่วนประกอบ "source" ในเวอร์ชันและจากนั้น pre-compiler / parser จะทำงานผ่านสิ่งเหล่านี้ หากพวกเขาใช้หน่วยความจำมากเกินไปคุณสามารถใส่พวกเขาในฐานข้อมูล SQL ที่รวดเร็วของบางชนิดหรือบันทึกเป็นไฟล์ไบนารี แต่ประเด็นของฉันคือใช้หน่วยความจำหรือฐานข้อมูล SQL เป็นพื้นที่ทำงาน / แคชของคุณเพื่อให้คุณไม่ต้องแยกวิเคราะห์สคริปต์ซ้ำแล้วซ้ำอีก คุณสามารถสร้างคอมไพเลอร์ย้ายไฟล์แยกวิเคราะห์เป็น "source-lib" และวิธีนี้ให้ precompiler ทำการกำหนดเวอร์ชันด้วย (เก็บไฟล์ก่อนหน้านี้เพื่อการย้อนกลับ)

หากมันเกี่ยวกับ "พื้นที่ฮาร์ดไดรฟ์ไม่ จำกัด " ให้ลงชื่อสมัครใช้เช่น Dropbox หรือ Amazon S3 แล้วซิงค์กับพวกเขา

ดังนั้นแผนสำหรับฉันในขณะนี้:

  1. กำหนดค่า / สคริปต์ / xml (บางรูปแบบที่มนุษย์สามารถอ่านได้) เป็นไฟล์ข้อความ (เช่นเดียวกับซอร์สโค้ด)
  2. Parser / validator ที่ทำงานผ่านสคริปต์ใหม่และตรวจสอบว่าพวกเขาปฏิบัติตามกฎ
  3. คอมไพเลอร์ที่สร้างไบนารี่หรือแถว SQL ออกจากไฟล์ดั้งเดิมดังนั้นสิ่งเหล่านี้จึงรวดเร็วในการเรียกใช้ + เร็วในการเรียกใช้

เกี่ยวกับความเสถียรในปัจจุบันฉันกำลังสร้างฐานข้อมูลให้เป็น "co-location host" และ autosync ระหว่างหลาย ๆ ที่ด้วยดังนั้นถ้าหากมีความล้มเหลวของเครือข่าย / ฮาร์ดแวร์หนึ่งตำแหน่งไซต์อื่น ๆ ควรจัดการปริมาณการใช้งานเดียวกัน / gamestates


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

1

หากคุณใช้couchdbคุณจะต้องบันทึกทุกอย่างเป็นโครงสร้าง JSON เป็นหลัก Couchdb จะดูแลการทำซ้ำข้อมูลของผู้ใช้ (หลายคน) ของคุณมากกว่าหรือน้อยกว่าอย่างไม่เจ็บปวด


0

คุณสามารถค้นหาโพรซีเดอร์ในUnity Wikiด้วย PHP, MySQL และ C # / JavaScript และใช้งานได้ตามวัตถุประสงค์

ประกอบด้วยสามขั้นตอน

  1. สร้างฐานข้อมูล MySQL เปล่าและตาราง
  2. สร้างสคริปต์ฝั่งเซิร์ฟเวอร์ PHP (ซึ่งจะเชื่อมต่อกับตาราง MySQL รับข้อมูลจาก Unity script (ขั้นตอนที่ 3) และค้นหาฐานข้อมูล (ตัวอย่างที่ให้ไว้คือการแทรกข้อมูลหรือเลือก)
  3. สร้างสคริปต์ Unity Controller (สิ่งนี้จะเชื่อมต่อกับสคริปต์ PHP ที่สร้างในขั้นตอนที่ 2)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.