मैंने पहले से ही उत्तर खोज लिए हैं, लेकिन मैं महंगे कार्यों / गणनाओं को संभालने के लिए सबसे अच्छा तरीका जानने में सक्षम नहीं था।
मेरे वर्तमान खेल (एक 2d टाइल-आधारित शहर की इमारत) में उपयोगकर्ता इमारतों को बनाने में सक्षम है, सड़कों का निर्माण कर सकता है आदि सभी भवनों को एक जंक्शन से कनेक्शन की आवश्यकता होती है जो उपयोगकर्ता को मानचित्र की सीमा पर रखना पड़ता है। यदि कोई इमारत इस जंक्शन से जुड़ी नहीं है, तो एक "सड़क से जुड़ा नहीं" संकेत प्रभावित इमारत के ऊपर पॉपअप होगा (अन्यथा इसे हटाया जाना है)। अधिकांश इमारतों में एक त्रिज्या होती है और एक-दूसरे से संबंधित हो सकती है (जैसे एक अग्निशमन विभाग सभी घरों को 30 टाइलों के दायरे में मदद कर सकता है)। जब सड़क कनेक्शन बदलता है तो मुझे भी अपडेट / जांच करने की आवश्यकता होती है।
कल मैं एक बड़े प्रदर्शन के मुद्दे पर भाग गया। निम्नलिखित परिदृश्य पर एक नज़र डालते हैं: एक उपयोगकर्ता बेशक इमारतों और सड़कों को भी मिटा सकता है। इसलिए यदि एक उपयोगकर्ता अब जंक्शन के ठीक बाद कनेक्शन तोड़ देता है तो मुझे उसी समय कई इमारतों को अपडेट करने की आवश्यकता होती है । मुझे लगता है कि नेस्टेड लूप (जो निश्चित रूप से इस परिदृश्य में एक बड़ा कारण है) से बचने के लिए पहली सलाह में से एक होगी, लेकिन मुझे जांच करनी होगी ...
- अगर कोई इमारत अभी भी जंक्शन से जुड़ी है, तो एक सड़क टाइल को हटा दिया गया है (मैं केवल उस सड़क से प्रभावित इमारतों के लिए ऐसा करता हूं)। (इस परिदृश्य में एक छोटा मुद्दा हो सकता है)
त्रिज्या टाइल की सूची और त्रिज्या (नेस्टेड छोरों - बड़ा मुद्दा!) के भीतर इमारतें प्राप्त करें ।
// Go through all buildings affected by erasing this road tile. foreach(var affectedBuilding in affectedBuildings) { // Get buildings within radius. foreach(var radiusTile in affectedBuilding.RadiusTiles) { // Get all buildings on Map within this radius (which is technially another foreach). var buildingsInRadius = TileMap.Buildings.Where(b => b.TileIndex == radiusTile.TileIndex); // Do stuff. } }
यह सब एक सेकंड के लिए 60 से लगभग 10 तक मेरे एफपीएस को तोड़ देता है ।
तो क्या मैं कर सकता था। मेरे विचार होंगे:
- इस एक के लिए मुख्य थ्रेड (अपडेट फ़ंक्शन) का उपयोग नहीं कर रहा है लेकिन एक और थ्रेड। जब मैं मल्टीथ्रेडिंग का उपयोग करना शुरू करता हूं तो मुझे लॉकिंग की समस्याओं में भाग सकता है।
- बहुत सी गणनाओं को संभालने के लिए एक कतार का उपयोग करना (इस मामले में सबसे अच्छा तरीका क्या होगा?)
- अधिक गणनाओं (जैसे त्रिज्या में इमारतों) से बचने के लिए मेरी वस्तुओं (इमारतों) में अधिक जानकारी रखें।
अंतिम दृष्टिकोण का उपयोग करते हुए मैं इसके बदले में एक घोंसले के शिकार को हटा सकता था:
// Go through all buildings affected by erasing this road tile.
foreach(var affectedBuilding in affectedBuildings) {
// Go through buildings within radius.
foreach(var buildingInRadius in affectedBuilding.BuildingsInRadius) {
// Do stuff.
}
}
लेकिन मुझे नहीं पता कि क्या यह पर्याप्त है। अगर खिलाड़ी के पास बड़ा नक्शा है तो सिटी स्काईलाइन्स जैसे खेलों को और अधिक इमारतों को संभालना होगा। वे उन चीजों को कैसे संभालते हैं ?! एक अद्यतन कतार हो सकती है क्योंकि सभी भवन एक ही समय में अद्यतन नहीं करते हैं।
मुझे आपके विचारों और टिप्पणियों की प्रतीक्षा है!
आपका बहुत बहुत धन्यवाद!