คุณจะวางรูปภาพทั้งหมดจากเกมหนึ่งไฟล์ได้อย่างไร?


67

ฉันเพิ่งเล่นเกม RPG พื้นฐานที่เขียนด้วย C ++ SFML แล้วฉันได้พยายามอย่างมากในเกมและฉันต้องการเผยแพร่เกมนี้ แต่ฉันพบปัญหาเล็กน้อย

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

นั่นคือสิ่งที่ฉันพยายามทำให้สำเร็จ: ฉันหวังว่าจะบรรจุภาพทั้งหมดใน 1 ไฟล์ (อาจเป็นไฟล์. txt ด้วย) จากนั้นสามารถอ่านจากไฟล์นั้นหรือเพิ่มได้อย่างง่ายดาย



ฉันเห็นโค้ดที่ภาพทั้งหมดถูกบรรจุในสตริงในโค้ด แต่นั่นก็ทำเนื่องจากความต้องการ (เป็นการแข่งขัน Java 64KB)
Omar Kooheji

ขออภัยเป็นการแข่งขัน 4Kb java ไม่ใช่ 64Kb หนึ่งอัน
Omar Kooheji

คำตอบ:


62

โปรแกรมเมอร์เกมพึ่งพาวิธีการเก็บข้อมูลหนึ่งในสองวิธี:

  • เก็บไฟล์ข้อมูลแต่ละไฟล์เป็นไฟล์แยกต่างหาก
  • จัดเก็บไฟล์ข้อมูลแต่ละไฟล์ในรูปแบบไฟล์เก็บถาวรที่กำหนดเอง

ข้อเสียเปรียบในการแก้ปัญหาแรกคือปัญหาพื้นที่ดิสก์ที่สูญเปล่ารวมถึงปัญหาการติดตั้งที่ช้าลง

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

นอกจากว่าคุณจะโหลดไฟล์ทั้งหมดจากไฟล์เก็บถาวร TAR / GZ อาจไม่ใช่ความคิดที่ดีนักเพราะคุณไม่สามารถแยกไฟล์ตามที่คุณต้องการ นี่คือเหตุผลที่หลาย ๆ เกมใช้ไฟล์ ZIP ซึ่งช่วยให้คุณสามารถแยกไฟล์แต่ละไฟล์ได้ตามต้องการ (ตัวอย่างที่ดีคือ Quake 3 ซึ่งมีไฟล์ PK3 เป็นไฟล์ ZIP แต่มีนามสกุลแตกต่างกัน)

แก้ไข: "ซ่อน" โครงสร้างโฟลเดอร์เกมและ "Keep" เฉพาะไฟล์ที่เรียกทำงานได้

วิธีแก้ไขปัญหาอื่นมักใช้เพื่อ "ซ่อน" ไฟล์เกมในโครงสร้างโฟลเดอร์ เก็บเฉพาะไฟล์ปฏิบัติการของคุณและไฟล์ readme ในไดเรกทอรีหลักและย้ายไฟล์เกมไปยังโฟลเดอร์ย่อยที่ชื่อว่า "data" หรืออื่น ๆ ที่เกี่ยวข้อง

แก้ไข: Gamedev Tuts Plus มีทรัพยากรที่ดี

แก้ไข: การเก็บถาวร

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

แก้ไข:ไฟล์รูปแบบ ZIP ที่มีนามสกุลเสริม

ที่นี่ฉันชอบความคิดเห็นของ @Joachim Sauer

การใช้ไฟล์ ZIP รูปแบบที่มีส่วนขยายทางเลือกที่มีประเพณีที่ดีด้านนอกของเกมเช่นกัน: Java ไม่ได้ที่รูปแบบ OpenDocument (aka รูปแบบ OpenOffice / LibreOffice) ไม่ได้แม้Office Open XML (aka "ใหม่" รูปแบบ Microsoft Office) ไม่ได้


2
ใช่ Thief / SystemShock2 ใช้ไฟล์. zip เปลี่ยนชื่ออย่างอื่นด้วย ใน Java คุณสามารถใช้ TrueZip เพื่อเข้าถึงไฟล์ในรหัสไปรษณีย์ราวกับว่ามันเป็นไฟล์ในโฟลเดอร์ฉันคิดว่ามีไลบรารีที่คล้ายกันสำหรับ C ++
นิค

18
การใช้ไฟล์ ZIP รูปแบบที่มีส่วนขยายทางเลือกที่มีประเพณีที่ดีด้านนอกของเกมเช่นกัน: Java ไม่ได้ที่รูปแบบ OpenDocument (aka รูปแบบ OpenOffice / LibreOffice) ไม่ได้แม้Office Open XML (aka "ใหม่" รูปแบบ Microsoft Office) ทำเช่นนั้น ...
Joachim Sauer

5
@Svish ขึ้นอยู่กับแพลตฟอร์มปริมาณของพื้นที่ดิสก์ที่ถ่ายด้วยไฟล์ขนาดเล็กจำนวนมากสามารถมากกว่าจำนวนที่ถ่ายโดยไฟล์ขนาดใหญ่ไฟล์เดียวถึงแม้ว่าไฟล์ขนาดใหญ่นั้นจะไม่ถูกบีบอัด.tarก็ตาม( ตัวอย่างเช่น) มันจะทำอย่างไรกับวิธีที่ข้อมูลถูกเก็บไว้ในดิสก์
TRiG

1
อานั่นเป็นเรื่องจริง ไม่ควรมากแม้ว่าจะมีมากแต่ในกรณีนี้มันสามารถสร้างขึ้นได้ ฉันนึกภาพการติดตั้งและถอนการติดตั้งได้รับความนิยมด้วยไฟล์ขนาดเล็กจำนวนมาก
Svish

2
มีความเกี่ยวข้องเล็กน้อยกับความคิดเห็นของ Kylotan นี่คือโพสต์โดย Jonathan Blow on The Witness 'dev-blog เกี่ยวกับการใช้คลังข้อมูลและวิธีที่พวกเขาโต้ตอบกับกลไกการปะติดของ Steam "พยานฯ บรรจุข้อมูลส่วนใหญ่ลงในไฟล์ขนาด 2 กิกะไบต์เดียวที่เก็บในรูปแบบ. zip ก่อนที่จะอัปโหลดเวอร์ชันเริ่มต้นไปยัง Steam ฉันใช้มาตรการป้องกันเพื่อลดขนาดโปรแกรมแก้ไขหรือคิดอย่างนั้น [... ] (จินตนาการ ไฟล์นั้นจะถูกจัดเก็บตามลำดับแบบสุ่ม: อาจเป็นเพราะแพทช์ทุกตัวเกี่ยวข้องกับผู้เล่นทุกคนที่จะดาวน์โหลดเกมใหม่ทั้งหมด!) "
Eric

39

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


8
+1 หากพื้นที่ว่างในดิสก์หรือการป้องกันไม่ใช่ปัญหานั่นเป็นการแก้ไขที่ง่ายที่สุด
Laurent Couvidou

1
+1 เพราะอีกคนบอกว่า +1 ไม่ผิดหรอกใช่มั้ย (ล้อเล่นกันคำตอบที่ดี)
jcora

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

3
@ Omnifarious ไม่เป็นความจริงเสมอไปเช่นเมื่ออ่านจากอ็อปติคัลดิสก์แม้ว่าจะเป็นระบบไฟล์ที่สมบูรณ์แบบมันเป็นเรื่องธรรมดาที่จะแพ็คไฟล์เพื่อโหลดเพื่อป้องกันการค้นหาที่มากเกินไป แต่นี่เป็นเรื่องที่แตกต่างอย่างสิ้นเชิงสำหรับฮาร์ดดิสก์และฉันมักจะคิดว่า OP อยู่ในกรณีนี้
Laurent Couvidou

3
@ Mr.Beast คุณพลาดจุดของฉัน ฉันกำลังพูดถึงออปติคัลดิสก์ ฉันทำงานสตูดิโอที่เป็นงานเต็มเวลาของโปรแกรมเมอร์คนหนึ่งเพื่อให้แน่ใจว่าไฟล์จะถูกบรรจุอย่างมีประสิทธิภาพมากที่สุดบนดีวีดีเพื่อให้ได้เวลาในการโหลดที่ดีที่สุดเท่าที่จะเป็นไปได้ ฉันแน่ใจว่าเขาจะดีใจที่ได้เรียนรู้ว่าเขาสามารถพึ่งระบบไฟล์ DVD ได้)
Laurent Couvidou

22

ฉันชอบPhysFSสำหรับสิ่งนี้ ช่วยให้คุณสามารถเข้าถึงโฟลเดอร์หรือไฟล์เก็บถาวร zip ด้วยรหัสเดียวกัน มันทำงานได้ดีสำหรับทุกช่วงอายุของเกม

  1. ระหว่างการพัฒนา : เข้าถึงทรัพยากรโดยตรงจากลำดับชั้นของโฟลเดอร์ วิธีนี้ไฟล์บีบอัดที่เก็บถาวรไม่ได้อยู่ในทางและคุณสามารถวนซ้ำอย่างรวดเร็ว
  2. การปรับใช้เริ่มต้น : บีบอัดทรัพยากรของคุณเพื่อให้ติดตั้งง่าย / ติดตั้งอย่างรวดเร็ว ไม่จำเป็นต้องเปลี่ยนรหัส เพียงชี้ PhysFS ที่ซิปแทนที่จะเป็นโฟลเดอร์
  3. อัปเดต / ดัดแปลง : PhysFS สามารถโหลดไฟล์เก็บถาวร zip หลายไฟล์โดยที่ทรัพยากรจากที่หนึ่งแทนที่อีกอันหนึ่ง การอัพเดตสามารถทำได้ง่ายเหมือนซิปใหม่ที่มีเฉพาะไฟล์ที่เปลี่ยนแปลง ในทำนองเดียวกันสำหรับ modding

ปรับปรุง:

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


4
ฉันใช้ PhysFS สำหรับโครงการปัจจุบันของฉันและฉันก็ชอบ ฉันไม่จำเป็นต้องสร้างไฟล์เก็บถาวรเนื้อหาอีกครั้ง ฉันสามารถวางเวอร์ชันที่อัปเดตในเส้นทางการค้นหาและ BAM! มันได้ผล.
Zack The Human

หลังจากคำตอบบางอย่างฉันตัดสินใจว่าฉันจะไปกับ physFS คุณสนใจที่จะแนะนำการสอนที่ดีหรือไม่? :)
Bugster

12

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


3

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

ด้วยไฟล์ข้อความฉันขอแนะนำให้คุณแปลงข้อมูลนั้นให้เป็นรูปแบบไบนารี ฉันค่อนข้างมั่นใจว่าคุณจะพบวิธีที่ง่ายในการทำ .. ตัวอย่างเช่นถ้าคุณใช้ AZ, az และ 0-9 คุณสามารถใช้ 6 บิตเพื่อเป็นตัวแทนของตัวละครแต่ละตัวซึ่งจะค่อนข้างปกป้องเนื้อหาที่มีลิขสิทธิ์ของคุณ จะป้องกันผู้อื่นจากการแก้ไขแผนที่ .. คุณสามารถเพิ่มตัวแปลงแผนที่ได้ตลอดเวลาหากคุณต้องการ การซิปเป็นข้อความที่สมเหตุสมผลอย่างสมบูรณ์


การแปลงเป็นไบนารี่เป็นคำแนะนำที่ดี แต่ไม่ใช่เพื่อการป้องกัน - มันจะง่ายกว่าในการแยกวิเคราะห์และโหลดได้เร็วขึ้น อยากจะแนะนำว่าเป็นขั้นตอนการประมวลผลล่วงหน้า แต่นั่นจะเป็นการปิดหัวข้อสำหรับคำถาม
Maximus Minimus

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

3
บน HDDs การโหลดไฟล์ซิปเดียวนั้นเร็วกว่าไฟล์ขนาดเล็กจำนวนมากเนื่องจากมีการสุ่มหาแพงกว่าลงในฟิสิคัลดิสก์ ไบนารีสำหรับเกมเล็ก ๆ สามารถแมปไว้ในหน่วยความจำและทำงานได้อย่างน่าอัศจรรย์โดยแทบไม่จำเป็นต้องแยกวิเคราะห์
Liosan

@ Liosan คุณอาจตีความผิดในสิ่งที่ฉันหมายถึงหรือเข้าใจผิดคุณ .. ฉันบอกว่าไบนารีดีกว่าสำหรับการจัดเก็บข้อมูลและนักออกแบบเกมอื่น ๆ ไม่น่าจะต้องการเรียนรู้วิธีแยกวิเคราะห์รหัสแผนที่ไบนารีของคุณ วัตถุประสงค์ ดังนั้นจึงมีการป้องกันขั้นพื้นฐานมากกว่าไฟล์ข้อความ
wolfdawn

2

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


หลังจากได้รับการอ้างอิงหลายอย่างเพื่อสร้างแผ่นสไปรต์ฉันได้พิจารณาการปรับโครงสร้างใหม่เพื่อลดจำนวนภาพ ขอบคุณ
Bugster

2

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

http://gamedev.tutsplus.com/tutorials/implementation/create-custom-binary-file-formats-for-your-games-data/

Sprite-sheets เป็นวิชาที่ต่างออกไปโดยสิ้นเชิง แต่มันก็เป็นบรรทัดฐานสำหรับเกมส่วนใหญ่ :)


1

วิธีอื่นที่คุณสามารถใช้:

รุ่นฟรีของXnViewมีคุณลักษณะที่เรียกว่า " Strip of Images" (SHIFT + A) sprite-collectionsซึ่งจะช่วยให้คุณสามารถสร้าง

นี้จะช่วยลดการเข้าถึงไฟล์และเป็นสิ่งสำคัญโดยเฉพาะอย่างยิ่งสำหรับการใช้งานเว็บ / HTTP-roundtripsเกมเพื่อลดจำนวนของ

การเข้าถึงภาพแต่ละภาพนั้นจะได้รับผ่านแผนที่พิกัด (เช่นคำจำกัดความ css)


0

ก่อนอื่นคุณต้องเขียนภาพ / เสียง / ฯลฯ ทั้งหมดของคุณเอง การโหลดงานประจำซึ่งใช้ API ที่กำหนดเองสำหรับการเข้าถึงข้อมูลที่เก็บถาวร ข้อเสียเปรียบเพิ่มเติมคือคุณต้องเขียนโปรแกรมอรรถประโยชน์การเก็บถาวรของคุณเองเพื่อสร้างคลังเก็บถาวรตั้งแต่แรก นอกจากว่าคุณจะโหลดไฟล์ทั้งหมดจากไฟล์เก็บถาวร TAR / GZ อาจไม่ใช่ความคิดที่ดีนักเพราะคุณไม่สามารถแยกไฟล์ตามที่คุณต้องการ นี่คือเหตุผลที่หลาย ๆ เกมใช้ไฟล์ ZIP ซึ่งช่วยให้คุณสามารถแยกไฟล์แต่ละไฟล์ได้ตามต้องการ (ตัวอย่างที่ดีคือ Quake 3 ซึ่งมีไฟล์ PK3 เป็นไฟล์ ZIP แต่มีนามสกุลแตกต่างกัน) http://zpp-library.sourceforge.net/

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