एक खेल इंजन में संपत्ति की पहचान?


12

मैं अपनी भरी हुई संपत्तियों की पहचान करना चाहता हूं, लेकिन मुझे नहीं पता कि मुझे कौन सा चुनना चाहिए। 2 विकल्प हैं:

  • नाम (स्ट्रिंग)

    • यह unordered_map (O (1)) के साथ सबसे आसान और तेज़ है, लेकिन पूर्णांक का उपयोग करते हुए धीमी गति से।
    • आसानी से कोड में समझा जा सकता है।
  • पूर्णांकों

    • सबसे तेजी से।
    • कोड में समझ में नहीं आता है।

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

मुझे पता है कि इस मुद्दे के पूरे इंटरनेट पर कुछ सूत्र हैं, लेकिन मुझे यह पता नहीं चल पाया कि यह किन मामलों में महत्वपूर्ण है।


10
दोनों का क्रियान्वयन क्यों नहीं? स्ट्रिंग संस्करण एक शब्दकोश <string, int> से जुड़ता है, जो बदले में एक शब्दकोश <int, Asset> कहता है। आप कोड में स्ट्रिंग आधारित परत को दरकिनार कर सकते हैं, लेकिन उपयोगकर्ता सहभागिता के लिए स्ट्रिंग आधारित परत का उपयोग कर सकते हैं।
क्रिएथिक

2
मैं दूसरी @ Krythic की बात करूँगा। यदि आपका कोड गति के लिए पूर्णांक पसंद करता है, तो अपने कोड को पूर्णांक का उपयोग करने दें। यदि आपके उपयोगकर्ता किंवदंतियों के लिए तार पसंद करते हैं, तो अपने उपयोगकर्ताओं को तार का उपयोग करने दें। दो काफी खुशी से रह सकते हैं (और आप चुनिंदा स्ट्रिंग संस्करण संकलन कर सकते हैं विकास बनाता में केवल, यदि आप रिलीज में भूमि के ऊपर पूरी तरह से छोड़ना चाहते)
DMGregory

जवाबों:


19

आप दोनों का समर्थन कर सकते हैं।

हालांकि यह अक्सर एक पूर्णांक या कुछ इसी तरह की तुलना करने वाली कुंजी द्वारा संपत्तियों को संदर्भित करने के लिए रनटाइम पर अधिक कुशल होता है, यह अक्सर नाम से उन्हें संदर्भित करने के लिए डिज़ाइन समय पर अधिक कुशल होता है, क्योंकि मनुष्य नामों की enemy_bullet_casing_soundतुलना में काम करने में बहुत बेहतर होते हैं 72910613

सीधे संसाधनों को देखने के लिए एक पूर्णांक कुंजी का उपयोग करें, और जहां भी संभव हो इस कोड का उपयोग करें (जहां आप पूर्णांक के वास्तविक मूल्य को एक चर में डाल सकते हैं और इस तरह से आसान काम कर सकते हैं)। उस पूर्णांक कुंजी को नाम से मैपिंग प्रदान करें (सीधे संसाधन के बजाय), और उस मैपिंग का उपयोग करें जब भी आप वास्तविक पूर्णांक कुंजी को हल करने के लिए परिसंपत्तियों के संदर्भ में नाम लेते हैं और संपत्ति पाते हैं।

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


मेरा मामला: मैं ऑब्जेक्ट की सामग्री को बदलना चाहता हूं, इसलिए मैं नई सामग्री के नाम के साथ एक अनुरोध भेजता हूं। (स्ट्रिंग) फिर ग्राफिक्स सिस्टम में एक <string, pointer> unorderered map में एक खोज होती है, और ऑब्जेक्ट के सामग्री के पॉइंटर को नए पॉइंटर से बदल दिया जाएगा। तो मेरे मामले में, मुझे इसे पूर्णांक में बदलना नहीं है? (क्योंकि मैं इसे पॉइंटर में बदल देता हूं और बार-बार अल्गोराइट्स में मैं पॉइंटर्स का उपयोग करता हूं, मैं केवल सामयिक चीजों के लिए तार का उपयोग करता हूं।)
ट्यूडवारी

या क्या मुझे पूर्णांक के बजाय पूर्णांक आईडी-एस का उपयोग करना चाहिए, हर जगह यह संभव है? (इसलिए मुझे उदाहरण के लिए सामग्री की हेडर फ़ाइल शामिल नहीं करनी है।) उदाहरण के लिए रेंडरर घटक अब प्रयुक्त सामग्री के पॉइंटर को संग्रहीत करता है, जिसका उपयोग सीधे ग्राफिक्स इंजन द्वारा किया जा सकता है, लेकिन मुझे Material.h को शामिल करना होगा। । लेकिन जब मैं रेंडरर घटक में केवल पूर्णांक संग्रहीत करता हूं, तो मुझे Material.h को शामिल करने की आवश्यकता नहीं है, लेकिन मुझे पॉइंटर्स की सरणी में पूर्णांक आधारित खोज करना होगा। मुझे लगता है कि बाद वाला बेहतर है। क्या यह? क्या मुझे इसे रिफ्लेक्टर करना चाहिए?
तुदवारी

1

मेरी परियोजना में मैं हैशेड स्ट्रिंग्स का उपयोग करता हूं, जो कि अद्वितीय समय में संकलित होते हैं (मैं चाहता हूं!) संख्या। इसलिए, जब मुझे एक संसाधन की आवश्यकता होती है, उदाहरण के लिए एक बनावट जिसे मैं बस कहता हूं

MngTexture->get(hash("my_texture"))

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

|my_texture| = "ball.PNG"

कहाँ || एक संचालक है जो संकलक को शब्द को हैश करने के लिए कहता है।

इसलिए मूल रूप से मैं स्ट्रिंग्स का उपयोग करता हूं, जो संकलित समय पर ints में मैप किए जाते हैं (इसलिए उनका कोई ओवरहेड नहीं है), वास्तविक कोड में और फ़ाइलों में दोनों जो लोडिंग घटकों के लिए स्ट्रीम हैं। हैश के संकलन के लिए बस एक बार संकलन करें, यह कोड की 5-10 लाइनों का एक सरल कार्य है।

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

उम्मीद है कि यह मदद कर सकता है।


0

तार द्वारा वस्तु की पहचान करना इष्टतम नहीं है, चींटियाँ अधिक कुशल होती हैं। सुविधा के लिए, आप डिज़ाइन समय पर और डीबगिंग के दौरान मदद करने के लिए स्ट्रिंग्स के स्ट्रिंग स्ट्रिंग (या शब्दकोश) बनाए रख सकते हैं।

हालाँकि, मैं इस बात की वकालत करूँगा कि आपके कोर गेम कोड के भीतर आप केवल उनके पूर्णांक आईडी (या पठनीयता के लिए एनम) द्वारा वस्तुओं को देखें। ऐसा करने से स्ट्रिंग टेबल को अलग संपत्ति के रूप में तोड़ना सरल हो जाता है। यदि आपका मुख्य गेम कोड इस स्ट्रिंग टेबल पर भरोसा नहीं करता है, तो आप इसे जारी किए गए गेम से संभवतः महत्वपूर्ण मात्रा में मेमोरी को बचा सकते हैं - एक महत्वपूर्ण विचार यदि आप मोबाइल गेम पर काम कर रहे हैं और डाउनलोड साइज को छोटा रखना चाहते हैं मुमकिन।

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