2012-06-15 8 views
10

मैं सीडी + के साथ एसडीएल का उपयोग कर 2 डी प्लेटफार्म गेम लिख रहा हूं। हालांकि मुझे संकल्प के लिए स्केलिंग शामिल एक बड़ी समस्या का सामना करना पड़ा है। मैं चाहता हूं कि खेल पूर्ण एचडी में अच्छा लगे, इसलिए खेल के लिए सभी छवियां बनाई गई हैं ताकि खेल का प्राकृतिक संकल्प 1920x1080 हो। हालांकि मैं चाहता हूं कि कोई गेम एक छोटे रिज़ॉल्यूशन का उपयोग कर रहा है या किसी बड़े रिज़ॉल्यूशन का उपयोग कर रहा है तो बड़े पैमाने पर स्केल करने के लिए गेम को सही रिज़ॉल्यूशन पर स्केल करना है।एसडीएल में संकल्प के लिए कैसे स्केल करें?

समस्या यह है कि मैं ऐसा करने का एक प्रभावी तरीका नहीं ढूंढ पा रहा हूं। मैंने एसडीएल_जीएफएक्स लाइब्रेरी का उपयोग करके सभी छवियों को पूर्व-स्केल करने के लिए शुरू किया लेकिन यह काम नहीं करता क्योंकि यह बहुत से ऑफ-बाय बनाता है एक त्रुटि, जहां एक पिक्सेल खो जा रहा था। और चूंकि मेरी एनिमेशन एक छवि में निहित होती है जब एनीमेशन एनीमेशन खेलता है तो प्रत्येक फ्रेम थोड़ा ऊपर या नीचे चला जाएगा।

फिर कुछ दिखने के बाद मैंने स्केलिंग को संभालने के लिए ओपनजीएल का उपयोग करने का प्रयास किया है। वर्तमान में मेरा प्रोग्राम सभी छवियों को एक एसडीएल_Surface में खींचता है जो 1920x1080 है। इसके बाद यह सतह को ओपनग्ल बनावट में बदल देता है, इस बनावट को स्क्रीन रिज़ॉल्यूशन में स्केल करता है, फिर बनावट खींचता है। यह अच्छी तरह से काम करता है लेकिन समस्या यह है कि यह बिल्कुल कुशल नहीं है। वर्तमान में मैं 18 :(

की एक अधिकतम एफपीएस हो रही है तो मेरे सवाल किसी को भी क्योंकि ओपन कि काम करने के लिए नहीं बनाया गया था एक कारगर तरीका स्क्रीन रिज़ॉल्यूशन पर एसडीएल प्रदर्शन पैमाने पर करने के बारे में पता है है?

+1

क्या आप ओपनजीएल का उपयोग कर रहे हैं जब आप फ्लाई पर ड्राइंग, कनवर्टिंग और स्केलिंग कर रहे हैं ?? – silent

+0

लोगों को gamedev मंच पर भी पूछें, वे आपकी मदद करने में सक्षम होना चाहिए। – silent

+0

हां, यही कारण है कि यह इतना अक्षम है। लेकिन वर्तमान में मुझे ऐसा करने का कोई अन्य तरीका नहीं मिल रहा है जो काम करता है। ठीक। कर दूँगा। –

उत्तर

10

यह अक्षम है । जिस तरह से मुख्य वर्तमान डिजाइन के साथ प्रदर्शन की समस्याओं:

  • सबसे पहले समस्या:।। आप एसडीएल एक टोंटी क्षमा करें, लेकिन कोई बात नहीं क्या आप इस विन्यास के साथ करते हैं, कि हो जाएगा के साथ सॉफ्टवेयर रास्टराइजिंग रहे 1920x1080 के एक संकल्प पर, आपके पास 2,073,600 पिक्सल रंग हैं। मान लीजिए कि आप प्रत्येक 4-चैनल पिक्सेल को छायांकित करने के लिए 10 घड़ी चक्र लेते हैं, एक 2GHz प्रोसेसर पर आप चल रहे हैं 96.4 एफपीएस के अधिकतम। यह बुरा नहीं लगता है, सिवाय इसके कि आप शायद छाया पिक्सल नहीं कर सकते हैं, और आपने अभी भी एआई, उपयोगकर्ता इनपुट, गेम मैकेनिक्स, ध्वनि, भौतिकी, और बाकी सब कुछ नहीं किया है, और आप शायद वैसे भी कम से कम एक बार कुछ पिक्सल पर ड्राइंग। एसडीएल_जीएफएक्स जल्दी हो सकता है, लेकिन बड़े संकल्पों के लिए, सीपीयू सिर्फ मूल रूप से ओवरटास्क किया गया है।
  • दूसरी समस्या: प्रत्येक फ्रेम, आप जीपीयू में ग्राफिक्स बस में डेटा कॉपी कर रहे हैं। यह सबसे धीमी चीज है जिसे आप संभवतः ग्राफिक्स-वार कर सकते हैं। छवि डेटा शायद का सबसे खराब है जो है, क्योंकि इसमें आमतौर पर बहुत अधिक है। असल में, प्रत्येक फ्रेम आप GPU को रैम से VRAM तक दो मिलियन कुछ पिक्सेल की प्रतिलिपि बनाने के लिए कह रहे हैं। Wikipedia के मुताबिक, आप 2,073,600 पिक्सल के लिए प्रत्येक 4 बाइट्स पर, 258.9 एफपीएस से अधिक नहीं होने की उम्मीद कर सकते हैं, जो तब तक खराब नहीं होता जब तक कि आपको बाकी सब कुछ याद न हो।

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

अब, यह एक बड़ी कमी के साथ आता है कि आपको ओपनजीएल ड्रा कमांड (जो काम है, लेकिन बहुत कठिन नहीं है, विशेष रूप से लंबे समय तक) के साथ सबकुछ रिकोड करना है। संक्षेप में, आप गति को बेहतर बनाने के लिए निम्नलिखित विचारों को आजमा सकते हैं:

  • पीबीओ।पिक्सेल बफर ऑब्जेक्ट्स का उपयोग बनावट बनाम/अतुल्यकालिक प्रतिलिपि बनाकर समस्या को हल करने के लिए किया जा सकता है।
  • अपने प्रतिपादन को मल्टीथ्रेड करें। अधिकांश CPUs में कम से कम दो कोर होते हैं और नए चिप्स पर दो रजिस्टर राज्यों को एकल कोर (Hyperthreading) के लिए सहेजा जा सकता है। आप अनिवार्य रूप से डुप्लिकेट कर रहे हैं कि GPU प्रतिपादन समस्या को हल करता है (बहुत सारे धागे जा रहे हैं)। मुझे यकीन नहीं है कि थ्रेड सुरक्षित एसडीएल_जीएफएक्स कैसे है, लेकिन मैं शर्त लगाता हूं कि कुछ काम किया जा सकता है, खासकर यदि आप एक ही समय में छवि के विभिन्न हिस्सों पर काम कर रहे हैं।
  • सुनिश्चित करें कि आप ध्यान आकर्षित करते हैं कि आपकी ड्रॉ सतह एसडीएल में किस जगह पर है। यह शायद एसडीएल_SWSURFACE होना चाहिए (क्योंकि आप सीपीयू पर चित्रित कर रहे हैं)।
  • VSync निकालें। यह प्रदर्शन में सुधार कर सकता है, भले ही आप 60 हर्ट्ज
  • पर नहीं चल रहे हैं सुनिश्चित करें कि आप अपना मूल बनावट बना रहे हैं - इसे किसी नए पर स्केल न करें या नीचे न करें। इसे एक अलग आकार में खीचें, और रास्टरराइज़र को काम करने दें!
  • स्पोरैडिक अपडेट: केवल एक समय में छवि को आधा अपडेट करें। यह शायद आपके "framerate" को दोगुना करने के करीब होगा, और यह (आमतौर पर) ध्यान देने योग्य नहीं है।
  • इसी तरह, केवल छवि के बदलते हिस्सों को अपडेट करें।

उम्मीद है कि इससे मदद मिलती है।

+0

एसडीएल 2.0 अब बाहर है, और यह 3 डी त्वरण 'पानी के नीचे' का उपयोग करता है। तो शायद यह आपके प्रदर्शन में मदद कर सकता है? –

संबंधित मुद्दे