थोड़ी सी पृष्ठभूमि, मैं एक विकास गेम को कोड ++ में एक दोस्त के साथ कोडिंग कर रहा हूं , इकाई प्रणाली के लिए ENTT का उपयोग कर रहा हूं। जीव 2 डी मानचित्र में घूमते हैं, साग या अन्य जीव खाते हैं, प्रजनन करते हैं और उनके लक्षण बदलते हैं।
इसके अतिरिक्त, जब खेल वास्तविक समय में चलाया जाता है, तो प्रदर्शन ठीक रहता है (60fps कोई समस्या नहीं), लेकिन मैं चाहता हूं कि किसी भी महत्वपूर्ण बदलाव को देखने के लिए 4h का इंतजार न करने के लिए इसे गति देने में सक्षम होना चाहिए। इसलिए मैं इसे जल्दी से जल्दी प्राप्त करना चाहता हूं।
मैं प्राणियों के लिए अपने भोजन को खोजने के लिए एक कुशल विधि खोजने के लिए संघर्ष कर रहा हूँ। प्रत्येक प्राणी को सबसे अच्छे भोजन की तलाश करनी चाहिए जो उनके लिए पर्याप्त है।
यदि यह खाना चाहता है, तो केंद्र में चित्रित प्राणी को अपने चारों ओर एक 149.64 त्रिज्या (इसकी दृश्य दूरी) और न्यायाधीश को देखना चाहिए कि वह किस भोजन का पीछा करना चाहिए, जो पोषण, दूरी और प्रकार (मांस या पौधे) पर आधारित है। ।
प्रत्येक प्राणी को अपना भोजन खोजने के लिए जिम्मेदार फ़ंक्शन रन-टाइम का लगभग 70% खा रहा है। वर्तमान में इसका लेखन कैसे सरल है, यह कुछ इस तरह से है:
for (creature : all_creatures)
{
for (food : all_entities_with_food_value)
{
// if the food is within the creatures view and it's
// the best food found yet, it becomes the best food
}
// set the best food as the target for creature
// make the creature chase it (change its state)
}
यह कार्य भोजन की तलाश करने वाले प्रत्येक प्राणी के लिए हर टिक को चलाया जाता है, जब तक कि जीव भोजन नहीं पाता है और अवस्था बदलता रहता है। प्राणियों के लिए हर बार नए खाद्य स्पॉन्ज भी चलाए जाते हैं, जो पहले से ही एक निश्चित भोजन का पीछा करते हैं, यह सुनिश्चित करने के लिए कि हर कोई उन्हें उपलब्ध सर्वोत्तम भोजन के बाद जाता है।
मैं इस प्रक्रिया को और अधिक कुशल बनाने के बारे में विचारों के लिए खुला हूं। मैं से जटिलता को कम करना पसंद करूंगा , लेकिन मुझे नहीं पता कि क्या यह संभव है।
जिस तरह से मैं पहले से ही इसे बेहतर बनाता हूं, वह all_entities_with_food_value
समूह को क्रमबद्ध करके किया जाता है ताकि जब कोई प्राणी खाने के लिए भोजन पर ध्यान केंद्रित करे, तो वह वहां रुक जाए। किसी भी अन्य सुधार स्वागत से अधिक हैं!
संपादित करें: उत्तर के लिए आप सभी का धन्यवाद! मैंने कई चीजों को विभिन्न उत्तरों से लागू किया है:
मैंने सबसे पहले और बस इसे बनाया इसलिए दोषी कार्य केवल एक बार हर पांच टिक्स को चलाता है, इससे खेल लगभग 4 गुना तेज हो गया, जबकि खेल के बारे में कुछ भी नहीं बदला।
उसके बाद मैंने भोजन की खोज प्रणाली में संग्रहीत भोजन के साथ सरणी को उसी टिक में रखा जिसे वह चलाता है। इस तरह मुझे केवल उस भोजन की तुलना करने की आवश्यकता है जो प्राणी नए खाद्य पदार्थों के साथ पीछा कर रहा है।
अंत में, अंतरिक्ष विभाजन में अनुसंधान और बीवीएच और क्वाडट्री पर विचार करने के बाद, मैं बाद के साथ चला गया, क्योंकि मुझे लगता है कि यह मेरे मामले के लिए बहुत सरल और बेहतर है। मैं इसे बहुत जल्दी लागू करता हूं और इसने बहुत बेहतर प्रदर्शन किया है, भोजन की खोज मुश्किल से किसी भी समय होती है!
अब प्रतिपादन यह है कि क्या मेरी गति धीमी हो रही है, लेकिन यह एक और दिन के लिए एक समस्या है। आप सभी को धन्यवाद!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
"जटिल" भंडारण संरचना को लागू करने की तुलना में आसान होना चाहिए यदि यह पर्याप्त रूप से अच्छा है। (संबंधित: यदि आप अपने आंतरिक लूप में कोड का थोड़ा और पोस्ट करते हैं तो यह हमारी मदद कर सकता है)