मैं अपने स्वयं के Minecraft का क्लोन लिख रहा हूं (जावा में भी लिखा है)। यह अभी महान काम करता है। 40 मीटर की दूरी देखने के साथ मैं अपने मैकबुक प्रो 8,1 पर 60 एफपीएस आसानी से मार सकता हूं। (इंटेल i5 + इंटेल एचडी ग्राफिक्स 3000)। लेकिन अगर मैं देखने की दूरी 70 मीटर रखूं, तो मैं केवल 15-25 एफपीएस तक पहुंच सकता हूं। वास्तविक Minecraft में, मैं एक समस्या के बिना दूर (= 256 मीटर) पर देखने के विघटन को लगा सकता हूं। तो मेरा सवाल यह है कि मुझे अपने खेल को बेहतर बनाने के लिए क्या करना चाहिए?
मेरे द्वारा लागू किए गए अनुकूलन:
- केवल स्थानीय विखंडू को स्मृति में रखें (खिलाड़ी की देखने की दूरी के आधार पर)
- Frustum culling (पहले विखंडू पर, फिर प्रखंडों पर)
- केवल ब्लॉकों के वास्तव में दृश्यमान चेहरे को चित्रित करना
- चंक प्रति सूची का उपयोग करना जिसमें दृश्य ब्लॉक होते हैं। दिखाई देने वाले चंक्स इस सूची में खुद को जोड़ लेंगे। यदि वे अदृश्य हो जाते हैं, तो वे स्वचालित रूप से इस सूची से हटा दिए जाते हैं। ब्लॉक पड़ोसी ब्लॉक के निर्माण या नष्ट होने से दिखाई देते हैं।
- प्रति खंडों की सूचियों का उपयोग करना जिसमें अद्यतन ब्लॉक होते हैं। दृश्यमान ब्लॉक सूची के रूप में समान तंत्र।
new
गेम लूप के अंदर लगभग कोई स्टेटमेंट का उपयोग न करें । (मेरा खेल लगभग 20 सेकंड तक चलता है जब तक कि कूड़ा उठाने वाले को आमंत्रित नहीं किया जाता)- मैं इस समय OpenGL कॉल सूची का उपयोग कर रहा हूं। (
glNewList()
,glEndList()
,glCallList()
) ब्लॉक का एक प्रकार के प्रत्येक पक्ष के लिए।
वर्तमान में मैं प्रकाश व्यवस्था के किसी भी प्रकार का उपयोग नहीं कर रहा हूँ। मैंने वीबीओ के बारे में पहले से ही सुना है। लेकिन मुझे नहीं पता कि यह वास्तव में क्या है। हालाँकि, मैं उनके बारे में कुछ शोध करूँगा। क्या वे प्रदर्शन में सुधार करेंगे? वीबीओ को लागू करने से पहले, मैं glCallLists()
कॉल सूची की एक सूची का उपयोग करने और पारित करने का प्रयास करना चाहता हूं । इसके बजाय हजार बार का उपयोग कर glCallList()
। (मैं यह कोशिश करना चाहता हूं, क्योंकि मुझे लगता है कि असली MineCraft VBO's का उपयोग नहीं करता है। सही है?)
क्या प्रदर्शन में सुधार करने के लिए अन्य चालें हैं?
VisualVM प्रोफाइलिंग ने मुझे यह दिखाया (केवल 33 फ्रेम के लिए प्रोफाइलिंग, 70 मीटर की दूरी देखने के साथ):
40 मीटर (246 फ्रेम) के साथ प्रोफाइलिंग:
नोट: मैं बहुत सारे तरीकों और कोड ब्लॉक को सिंक्रनाइज़ कर रहा हूं, क्योंकि मैं दूसरे धागे में चंक्स पैदा कर रहा हूं। मुझे लगता है कि किसी ऑब्जेक्ट के लिए लॉक प्राप्त करना एक गेम लूप में बहुत कुछ करने पर एक प्रदर्शन का मुद्दा है (बेशक, मैं उस समय के बारे में बात कर रहा हूं जब केवल गेम लूप है और कोई नया हिस्सा उत्पन्न नहीं होता है)। क्या यह सही है?
संपादित करें: कुछ synchronised
ब्लॉकों और कुछ अन्य छोटे सुधारों को हटाने के बाद । प्रदर्शन पहले से काफी बेहतर है। यहाँ 70 मीटर के साथ मेरे नए रूपरेखा परिणाम हैं:
मुझे लगता है कि यह बहुत स्पष्ट है कि selectVisibleBlocks
यहाँ मुद्दा है।
अग्रिम में धन्यवाद!
Martijn
अद्यतन : कुछ अतिरिक्त सुधारों के बाद (जैसे प्रत्येक के लिए छोरों का उपयोग करना, छोरों के बाहर चर बफ़र करना, आदि ...), मैं अब देखने की दूरी 60 बहुत अच्छा चला सकता हूं।
मुझे लगता है कि मैं जल्द से जल्द वीबीओ लागू करने जा रहा हूं।
PS: सभी स्रोत कोड GitHub: https://github.com/mcourteaux/CraftMania पर उपलब्ध है