आप एक गेम से 1 फ़ाइल तक सभी छवियां कैसे डाल सकते हैं?


67

मैंने C ++ SFML में लिखा एक बुनियादी आरपीजी खेल समाप्त कर लिया है, मैंने खेल में बहुत प्रयास किया है और मैं इसे वितरित करना चाहता हूं, हालांकि मैं एक छोटे से मुद्दे में भाग गया हूं।

समस्या यह है, मेरे पास 200 से अधिक छवियां और मानचित्र फाइलें हैं (वे .txt फाइलें जो मानचित्र कोड रखती हैं) सभी निष्पादन योग्य के समान फ़ोल्डर में हैं, जब मैं फ़ोल्डर में देखता हूं, तो यह मुझे देखकर थोड़ा रोना चाहता है इतने सारे संसाधन, मैंने कभी ऐसा खेल नहीं देखा जो आपको सीधे सभी संसाधनों को दिखाता हो, इसके बजाय मुझे लगता है कि वे संसाधनों को एक निश्चित फ़ाइल में पैक करते हैं।

ठीक है, कि मैं क्या हासिल करने की कोशिश कर रहा हूं: मैं सभी छवियों को 1 फ़ाइल में पैक करने की उम्मीद कर रहा हूं (शायद .txt फ़ाइलों के रूप में अच्छी तरह से) फिर उस फ़ाइल से पढ़ने या आसानी से इसे जोड़ने में सक्षम हो।



मैंने कोड देखा है जहां सभी छवियों को कोड में एक स्ट्रिंग में पैक किया गया था। लेकिन ऐसा आवश्यकताओं के कारण किया गया था। (यह 64KB जावा प्रतियोगिता थी)
ओमर कूहेजी

खेद है कि यह एक 4K java प्रतियोगिता थी। 64Kb वाला नहीं।
उमर कूहीजी

जवाबों:


62

गेम प्रोग्रामर ने डेटा स्टोरेज के दो मुख्य तरीकों में से एक पर भरोसा किया है:

  • प्रत्येक डेटा फ़ाइल को एक अलग फ़ाइल के रूप में संग्रहीत करें
  • प्रत्येक डेटा फ़ाइल को कस्टम संग्रह प्रारूप में संग्रहीत करें

पहले समाधान की कमी व्यर्थ डिस्क स्थान की समस्या है, साथ ही धीमी प्रतिष्ठानों की समस्या भी है।

दूसरा समाधान यह प्रदान करता है कि यह स्वयं की कमियां हैं, पहला यह है कि आपको अपनी सभी छवि / ध्वनि / आदि लिखना होगा। लोडिंग रूटीन जो संग्रहीत डेटा तक पहुंचने के लिए एक कस्टम एपीआई का उपयोग करते हैं। एक और दोष यह है कि आपको अभिलेखागार के निर्माण के लिए अपनी स्वयं की संग्रह उपयोगिता लिखनी होगी।

जब तक आप हमेशा संग्रह से सभी फ़ाइलों को लोड करेंगे, TAR / GZ एक बहुत अच्छा विचार नहीं हो सकता है, क्योंकि आप विशिष्ट फ़ाइलों को नहीं निकाल सकते हैं क्योंकि आपको उनकी आवश्यकता है। यही कारण है कि कई गेम ज़िप अभिलेखागार का उपयोग करते हैं, जो आपको आवश्यक के रूप में व्यक्तिगत फ़ाइलों को निकालने की अनुमति देते हैं (एक अच्छा उदाहरण क्वेक 3 है, जिसकी पीके 3 फाइलें एक अलग विस्तार के साथ ज़िप फ़ाइलों के अलावा कुछ भी नहीं हैं)।

संपादित करें: खेल फ़ोल्डर संरचना को "छुपाएं" और केवल "निष्पादन" रखें

एक अन्य समाधान अक्सर फ़ोल्डर संरचना में गेम फ़ाइलों को "छिपाने" के लिए उपयोग किया जाता है। केवल अपने निष्पादक और मुख्य निर्देशिका में एक रीडमी फ़ाइल रखें और गेम फ़ाइलों को "डेटा" या अन्य संबंधित नाम के उप फ़ोल्डर में स्थानांतरित करें।

संपादित करें: Gamedev Tuts Plus के पास एक अच्छा संसाधन है

EDIT: लिबेरक्टिव

एक संभावित समाधान लिबेरक्टिव, जो एक संग्रह पुस्तकालय है जो ज़िप फ़ाइल जैसी संग्रह से फ़ाइलों को निकालने का काम करेगा। यहां तक ​​कि यह आपको निकाले गए फ़ाइल को एक मानक फ़ाइल पॉइंटर को असाइन करने की अनुमति देता है, जो संभवतः किसी भी अन्य पुस्तकालयों के साथ संभावित रूप से अधिक सरलता से इंटरफेस करेगा।

संपादित करें: वैकल्पिक विस्तार के साथ ज़िप प्रारूप फाइलें

यहां, मुझे @ जोकिम सौर की टिप्पणी पसंद है

वैकल्पिक एक्सटेंशन के साथ ज़िप-प्रारूप फ़ाइलों का उपयोग करने के साथ-साथ खेलों के बाहर भी एक महान परंपरा है: जावा यह करता है , OpenDocument प्रारूप (उर्फ OpenOffice / LibreOffice प्रारूप) करता है , यहां तक ​​कि Office Open XML (उर्फ "नया" Microsoft Office प्रारूप) भी है करता है


2
हाँ, चोर / SystemShock2 का उपयोग किया गया है। ज़िप फ़ाइलों का नाम कुछ और भी रखा गया है। जावा में आप ज़िप में फ़ाइलों को एक्सेस करने के लिए ट्रूज़िप जैसे कुछ का उपयोग कर सकते हैं जैसे कि वे फ़ोल्डर्स में फाइल थे, मुझे लगता है कि सी ++ के लिए समान लाइब्रेरी हैं।
निक

18
वैकल्पिक एक्सटेंशन के साथ ज़िप-प्रारूप फ़ाइलों का उपयोग करने के साथ-साथ खेलों के बाहर भी एक महान परंपरा है: जावा यह करता है , OpenDocument प्रारूप (उर्फ OpenOffice / LibreOffice प्रारूप) करता है , यहां तक ​​कि Office Open XML (उर्फ "नया" Microsoft Office प्रारूप) भी है करता है , ...
जोकिम सउर

5
@Svish। प्लेटफ़ॉर्म के आधार पर, बहुत सी छोटी फ़ाइलों द्वारा उठाए गए डिस्क स्थान की मात्रा एक बड़ी फ़ाइल द्वारा ली गई राशि से काफी अधिक हो सकती है, भले ही वह बड़ी फ़ाइल बिल्कुल भी संकुचित न हो ( .tarउदाहरण के लिए)। यह उस तरह से करना है जिस तरह से डेटा को डिस्क पर भौतिक रूप से संग्रहीत किया जाता है।
TRGG

1
आह, यह सच है। हालांकि ज्यादा नहीं होना चाहिए, जब तक देखते हैं एक बहुत है, लेकिन उस मामले में यह वास्तव में निर्माण कर सकते हैं। मैं कल्पना कर सकता हूं कि स्थापना और स्थापना रद्द करना बहुत सारी छोटी फ़ाइलों के साथ एक हिट है।
सविश

2
Kylotan की टिप्पणी से थोड़ा संबंधित है, यहाँ जोनाथन ब्लो द्वारा साक्षी के देव-ब्लॉग पर अभिलेखागार का उपयोग करने के बारे में एक पोस्ट है और वे स्टीम के पैचिंग तंत्र के साथ कैसे बातचीत करते हैं। "गवाह अपने अधिकांश डेटा को .zip प्रारूप में संग्रहीत एक एकल-गीगाबाइट फ़ाइल में पैक करता है। स्टीम के प्रारंभिक संस्करण को अपलोड करने से पहले, मैंने पैच आकार को कम करने के लिए एक सुरक्षा उपाय किया, या इसलिए मैंने सोचा [...] (कल्पना करें) यह फ़ाइलें यादृच्छिक क्रम में संग्रहीत की जाती हैं: शायद हर पैच में हर खिलाड़ी को पूरे गेम को फिर से डाउनलोड करना शामिल है!) "
एरिक

39

एक और समाधान जो अक्सर खेल फ़ाइलों को "छिपाने" के लिए उपयोग किया जाता है वह है फ़ोल्डर संरचना। केवल अपने निष्पादक और मुख्य निर्देशिका में एक रीडमी रखें और गेम फ़ाइलों को एक उप फ़ोल्डर "डेटा" में स्थानांतरित करें। मुझे नहीं लगता कि ऐसा करना बहुत असामान्य है। कई खेल मुझे पता है कि उनकी सामग्री को इस तरह से संग्रहीत किया जाता है।


8
+1 यदि डिस्क स्थान या सुरक्षा कोई समस्या नहीं है, तो यह सबसे आसान समाधान है।
लॉरेंट कौविदो

1
+1 क्योंकि दूसरे लड़के ने +1 किया। गलत नहीं हो सकता, एह? (एक तरफ मजाक करते हुए, शानदार जवाब।)
जकोरा

यह, मेरी राय में, आदर्श विकल्प है। यदि फ़ाइल सिस्टम हैंडल नहीं कर सकता है तो कुशलता से फाइल सिस्टम टूट गया है और आपको इसे सुधारने के लिए OS निर्माता पर झुकाव होना चाहिए।
सर्वव्यापी

3
@Onifarious यह हमेशा सच नहीं होता है, जैसे कि एक ऑप्टिकल डिस्क से पढ़ते हुए, यहां तक ​​कि एक सही फाइल सिस्टम के साथ, अत्यधिक मांग को रोकने के लिए लोडिंग ऑर्डर में फ़ाइलों को पैक करना आम है (वास्तव में गति काफी आश्चर्यजनक हो सकती है)। लेकिन हार्ड डिस्क के लिए यह पूरी तरह से अलग कहानी है, और मुझे लगता है कि ओपी इस मामले में है।
लॉरेंट कौविदो

3
@ Mr.Beast आपने मेरी बात को याद किया। मैं ऑप्टिकल डिस्क के बारे में बात कर रहा हूं। मैंने एक स्टूडियो के लिए काम किया है जहाँ यह सुनिश्चित करने के लिए एक एकल प्रोग्रामर का पूर्णकालिक काम था कि एक डीवीडी पर जितना संभव हो उतना कुशलतापूर्वक पैक किया जाए, ताकि सबसे अच्छा लोडिंग समय संभव हो सके। मुझे यकीन है कि उसे यह जानकर ख़ुशी होगी कि वह सिर्फ डीवीडी फ़ाइल सिस्टम पर भरोसा कर सकता था;)
लॉरेंट कौविदौ

22

मुझे वास्तव में इसके लिए PhysFS पसंद है । यह आपको एक ही कोड के साथ फ़ोल्डर या ज़िप अभिलेखागार तक पहुंचने की अनुमति देता है। यह एक खेल के सभी चरणों के लिए अच्छी तरह से काम करता है।

  1. विकास के दौरान : एक पदानुक्रम से सीधे संसाधनों तक पहुंचें। इस तरह से संपीड़ित अभिलेखागार रास्ते में नहीं हैं और आप तेजी से पुनरावृति कर सकते हैं।
  2. प्रारंभिक तैनाती : आसान तैनाती / त्वरित इंस्टॉल के लिए अपने संसाधनों को ज़िप करें। किसी भी कोड को बदलने की जरूरत नहीं है। बस फ़ोल्डर के बजाय ज़िप पर PhysFS बिंदु।
  3. अपडेट / मोडिंग: PhysFS कई ज़िप अभिलेखागार को लोड कर सकता है जहां एक से संसाधन दूसरे को ओवरराइड करते हैं। अद्यतन केवल परिवर्तित फ़ाइलों के साथ एक नए ज़िप के रूप में सरल हो सकता है। इसी तरह मोडिंग के लिए।

अपडेट करें:

मैंने PhysFS सीखने के लिए स्रोत और doxygen के प्रलेखन के साथ शामिल ट्यूटोरियल का उपयोग किया । एपीआई वास्तव में काफी सरल है, आप फ़ाइल पथ के बजाय मेमोरी बफ़र्स के माध्यम से एसएफएमएल में छवियों को लोड करने के लिए सीखने में अधिक समय व्यतीत करेंगे।


4
मैं अपने वर्तमान प्रोजेक्ट के लिए PhysFS का उपयोग कर रहा हूं और मुझे यह पसंद है। मुझे हमेशा अपनी सामग्री संग्रह फ़ाइल को पुनर्जीवित करने की आवश्यकता नहीं है; मैं बस खोज पथ और BAM में एक अद्यतन संस्करण छोड़ सकता हूँ! यह काम करता हैं।
ज़ैक द ह्यूमन

कुछ उत्तरों के बाद मैंने तय किया कि मैं फिजियोफैस के साथ जाऊंगा। क्या आप एक अच्छे ट्यूटोरियल की सिफारिश करना चाहेंगे? :)
बगस्टर

12

मैं एक ज़िप फ़ाइल का उपयोग करने का सुझाव देता हूं। यह एक सर्वव्यापी प्रारूप है और आपको तैयार लाइब्रेरी मिलेगी जो आपको ज़िप फ़ाइल के भीतर से फाइल लोड करने की अनुमति देती है। एक त्वरित Google खोज ने sfml के लिए ज़िप लोडर का भी खुलासा किया ।


3

ठीक है, आप धोखा दे सकते हैं जैसा कि उन्होंने उल्लेख किया है :) आप इमेजरी से स्प्राइट-शीट बना सकते हैं, आजकल इसे ज़िप करने की कोई आवश्यकता नहीं है जब तक कि यह एक टन स्थान नहीं बचाता है। छवियों से स्प्राइट-शीट या कई स्प्राइट-शीट बनाने के बाद, आप केवल उनके एक्सटेंशन का नाम बदल सकते हैं। अधिकांश गेमर चेक करने की जहमत नहीं उठाएँगे और उन विकल्पों को क्यों नहीं छोड़ेंगे जो भविष्य में आपके गेम को मॉडिफाई करना चाहते हैं? इस तरह वे एक स्प्राइट-शीट भी बना सकते हैं, इसका नाम बदलकर रोलिंग शुरू कर सकते हैं।

पाठ फ़ाइलों के साथ, मैं विनम्रतापूर्वक आपको उस डेटा को द्विआधारी रूप में परिवर्तित करने का सुझाव दूंगा। मुझे पूरा यकीन है कि आप इसे करने का एक सरल तरीका पाएंगे .. उदाहरण के लिए, यदि आप केवल AZ, az और 0-9 का उपयोग करते हैं, तो आप प्रत्येक वर्ण का प्रतिनिधित्व करने के लिए 6 बिट्स का उपयोग कर सकते हैं, जो कुछ हद तक आपके कॉपीराइट की गई सामग्री की रक्षा करेगा, यह दूसरों को मानचित्रों को संपादित करने से भी रोकेगा। यदि आप चाहें तो आप हमेशा मानचित्र कनवर्टर जोड़ सकते हैं। Zipping हालांकि पाठ के लिए पूरी तरह से उचित है।


बाइनरी में कनवर्ट करना अच्छी सलाह है, लेकिन सुरक्षा के लिए नहीं - यह सिर्फ पार्स करने में आसान है और लोड करने में तेज़ है। इसे प्री-प्रोसेसिंग कदम के रूप में सुझाएंगे, लेकिन यह प्रश्न के लिए ऑफ-टॉपिक है।
मैक्सिमस मिनिमस

खैर, मैं अनुमान लगा रहा हूं, अगर वह इसे और अधिक प्रभावी रूप से संरक्षित करना चाहता है, तो वह इसे आरएसए या एक समान एल्गोरिथ्म में एन्क्रिप्ट करने का प्रयास कर सकता है (कोई आवश्यकता नहीं है)। मुझे संदेह है कि अगर कोई बाइनरी फ़ाइल के अंदर है तो कोई भी किसी इंडी गेम से मैप फ़ाइलों का अनधिकृत उपयोग करेगा। यह सिर्फ हमारे पार्सिंग का अनुमान लगाने में समय लगाने के लायक नहीं लगता है। पाठ फ़ाइलें बस पूरी तरह से असुरक्षित हैं और जैसा कि आपने डेटा संग्रहीत करने के लिए अप्रभावी कुछ सुझाया है।
वुल्फडाउन

3
एचडीडी पर, एक सिंगल जिप-फाइल लोड करना बहुत सारी छोटी फाइलों की तुलना में तेज है क्योंकि फिजिकल डिस्क में कम महंगे रैंडम सीक होते हैं। एक छोटे से खेल के लिए एक बाइनरी को स्मृति में मैप किया जा सकता है और "जादुई रूप से" काम किया जा सकता है, लगभग किसी भी पार्सिंग की आवश्यकता नहीं है।
Liosan

@Liosan आप गलत अर्थ लगा सकते हैं कि मेरा क्या मतलब है या मैंने आपको गलत समझा है। मैंने कहा कि बाइनरी डेटा संग्रहीत करने के लिए बेहतर है और अन्य गेम डिजाइनरों को आपके बाइनरी मैप कोड को पार्स करने का तरीका सीखने की संभावना नहीं है, जब तक कि इसे संशोधित करने और संशोधित करने के लिए प्रोत्साहित नहीं किया जाता है। प्रयोजनों। इसलिए यह पाठ फ़ाइलों पर कुछ अल्पविकसित संरक्षण प्रदान करता है।
वुल्फडाउन

2

यह केवल संसाधनों या डिस्क स्थान की संख्या के बारे में नहीं है।
कई अलग-अलग बनावट की फ़ाइलों के साथ, जैसा कि आप एसएफएमएल का उपयोग कर रहे हैं, जो ओपनजीएल के साथ प्रदान करता है, हर बार जब आप एक बनावट को प्रस्तुत करने जा रहे हैं, तो ओपनजीएल को अगली बनावट को वीडियो कार्ड (चेक glBindTexture ()) से बांधने की आवश्यकता है, और यह है एक बहुत महंगा काम है।
इस बात को ध्यान में रखते हुए कि आप महसूस कर सकते हैं कि क्यों खेल आमतौर पर आपके मेनू / स्तर / खेल के नक्शे के अनुसार एक ही बुनावट में तथाकथित स्प्राइट, तथाकथित स्प्राइटशीट डालते हैं।
परिणाम प्रदर्शन में एक बड़ा लाभ है, क्योंकि आप एक ही बाइंड टेक्सचर कॉल के साथ बहुत सारे स्प्राइट प्रदान कर रहे हैं।


स्प्राइटशीट बनाने के लिए कई संदर्भ मिलने के बाद मैंने इमेज काउंट कम करने के लिए कुछ रीफैक्टरिंग पर विचार किया है। धन्यवाद
बुगस्टर

2

मैं व्यक्तिगत रूप से इसके लिए कस्टम बाइनरी फ़ाइल मार्ग को बंद कर दूंगा। यह कुछ ऐसा है जो मैं अब हर समय खुद करता हूं, यह उतना मुश्किल नहीं है जितना कि यह ध्वनि हो सकता है, और यह आपके लिए गेम संसाधन फ़ाइलों का स्तर भी प्रदान करता है। मैंने इस बारे में एक छोटा परिचयात्मक Gamedev लेख लिखा है अगर आप रुचि रखते हैं तो बहुत पहले नहीं:

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

स्प्राइट-शीट पूरी तरह से एक अलग विषय है लेकिन वे अधिकांश खेलों के लिए आदर्श हैं :)


1

एक अन्य विधि जिसका आप उपयोग कर सकते हैं:

XnView का मुफ्त संस्करण " Strip of Images" (SHIFT + A) नामक एक सुविधा प्रदान करता है , जो आपको बनाने की अनुमति देता है sprite-collections

यह फ़ाइल पहुंच को कम करता है और वेब एप्लिकेशन / गेम के लिए विशेष रूप से महत्वपूर्ण है कि इसकी संख्या कम से कम हो HTTP-roundtrips

व्यक्तिगत छवियों तक पहुंच तब समन्वयित मानचित्रों के माध्यम से दी जाती है (उदाहरण के लिए सीएसएस-परिभाषाएँ)।


0

सबसे पहले आपको अपनी सभी इमेज / साउंड / आदि लिखना होगा। लोडिंग रूटीन जो संग्रहीत डेटा तक पहुंचने के लिए एक कस्टम एपीआई का उपयोग करते हैं। एक और दोष यह है कि आपको अभिलेखागार के निर्माण के लिए अपनी स्वयं की संग्रह उपयोगिता लिखनी होगी। जब तक आप हमेशा संग्रह से सभी फ़ाइलों को लोड करेंगे, TAR / GZ एक बहुत अच्छा विचार नहीं हो सकता है, क्योंकि आप विशिष्ट फ़ाइलों को नहीं निकाल सकते हैं क्योंकि आपको उनकी आवश्यकता है। यही कारण है कि कई गेम ज़िप अभिलेखागार का उपयोग करते हैं, जो आपको आवश्यक के रूप में व्यक्तिगत फ़ाइलों को निकालने की अनुमति देते हैं (एक अच्छा उदाहरण क्वेक 3 है, जिसकी पीके 3 फाइलें एक अलग विस्तार के साथ ज़िप फ़ाइलों के अलावा कुछ भी नहीं हैं)। http://zpp-library.sourceforge.net/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.