2 डी गेम में हम बड़ी वीडियो मेमोरी आवश्यकताओं को कैसे हल करते हैं?
हम एलीग्रो सी / सी ++ में 2 डी गेम (फैक्टरियो) विकसित कर रहे हैं, और गेम की सामग्री बढ़ने पर हमें वीडियो मेमोरी आवश्यकताओं में वृद्धि का सामना करना पड़ रहा है।
हम वर्तमान में उन सभी छवियों के बारे में पूरी जानकारी इकट्ठा करते हैं जो पहले इस्तेमाल की जा रही हैं, इन सभी छवियों को यथासंभव अधिक से अधिक फसलें और उन्हें बड़े एटलायस में कसकर व्यवस्थित करें। ये एटलस वीडियो मेमोरी में संग्रहीत होते हैं, जिनमें से आकार सिस्टम की सीमाओं पर निर्भर करता है; वर्तमान में यह आमतौर पर 8192x8192 तक की 2 छवियां हैं, इसलिए उन्हें 256Mb से 512Mb वीडियो मेमोरी की आवश्यकता होती है।
यह प्रणाली हमारे लिए बहुत अच्छा काम करती है, जैसा कि कुछ कस्टम ऑप्टिमाइजेशन और रेंडर और अपडेट थ्रेड को विभाजित करके हम 60 एफपीएस में स्क्रीन पर हजारों छवियों को खींचने में सक्षम हैं; हमारे पास स्क्रीन पर कई ऑब्जेक्ट हैं, और एक बड़ी ज़ूम-आउट की अनुमति देना एक महत्वपूर्ण आवश्यकता है। जैसा कि हम और अधिक जोड़ना चाहते हैं, वीडियो मेमोरी आवश्यकताओं के साथ कुछ परेशानी होने वाली है, इसलिए यह सिस्टम संभवतः पकड़ नहीं सकता है।
जिन चीजों की हम कोशिश करना चाहते थे उनमें से एक है सबसे सामान्य चित्रों के साथ एक एटलस और दूसरा कैश के रूप में। मांग पर छवियों को बिटमैप से स्थानांतरित किया जाएगा। इस दृष्टिकोण के साथ दो समस्याएं हैं:
- मेमोरी बिटमैप से वीडियो बिटमैप तक की ड्राइंग एलीग्रो में धीमी गति से होती है।
- रूपांतर में, मुख्य थ्रेड के अलावा अन्य वीडियो बिटमैप के साथ काम करना संभव नहीं है, इसलिए यह व्यावहारिक रूप से अनुपयोगी है।
हमारे पास कुछ अतिरिक्त आवश्यकताएं हैं:
- खेल को निश्चित होना चाहिए, इसलिए प्रदर्शन के मुद्दे / लोडिंग समय कभी भी खेल की स्थिति को बदल नहीं सकते हैं।
- खेल वास्तविक समय है, और जल्द ही मल्टीप्लेयर होने के लिए, साथ ही साथ। हमें हर कीमत पर सबसे छोटे हकलाने से बचने की जरूरत है।
- अधिकांश खेल एक निरंतर खुली दुनिया है।
परीक्षण में 1x1 से 300x300 तक के आकार के लिए एक बैच में 10 000 स्प्राइट्स शामिल हैं, हर कॉन्फ़िगरेशन के लिए कई बार। मैंने Nvidia Geforce GTX 760 पर परीक्षण किए।
- वीडियो बिटमैप से वीडियो बिटमैप ड्राइंग में 0.1us प्रति स्प्राइट लिया गया, जब स्रोत बिटमैप व्यक्तिगत बिटमैप (एटलस संस्करण) के बीच नहीं बदल रहा था; आकार मायने नहीं रखता था
- वीडियो बिटमैप वीडियो बिटमैप ड्राइंग के लिए, जबकि स्रोत बिटमैप चित्र (गैर एटलस संस्करण) के बीच स्विच किया गया था, प्रति स्प्राइट 0.56us लिया; आकार या तो मायने नहीं रखता था।
- वीडियो बिटमैप ड्राइंग के लिए मेमोरी बिटमैप वास्तव में संदिग्ध था। 1x1 से 200x200 तक के आकार में 0.3 बिट प्रति बिटमैप लिया गया, इसलिए यह बहुत धीमा नहीं है। बड़े आकार के लिए, समय बहुत नाटकीय रूप से, 9x पर 201x201 के लिए 3116us से 291x291 के लिए शुरू हुआ।
एटलस का उपयोग करने से 5 से अधिक के कारक से प्रदर्शन में वृद्धि होती है। यदि मेरे पास प्रतिपादन के लिए 10ms थे, तो एटलस के साथ मैं प्रति फ्रेम 100 000 स्प्राइट्स तक सीमित हूं, और इसके बिना, 20 000 स्प्राइट्स की सीमा। यह समस्याग्रस्त होगा।
मैं भी छाया के लिए बिटमैप संपीड़न और 1bpp बिटमैप प्रारूप का परीक्षण करने का एक तरीका खोजने की कोशिश कर रहा था, लेकिन मुझे एलीग्रो में ऐसा करने का तरीका नहीं मिल पा रहा था।