में सदस्य टेम्पलेट फ़ंक्शन में तत्वों तक पहुंचने पर unordered_map से कम प्रदर्शन मैं एक गेम इंजन प्रोजेक्ट पर घटक आधारित आर्किटेक्चर को कार्यान्वित करने का प्रयास कर रहा हूं। प्रत्येक GameObject में unordered_map
है जो Component
बेस क्लास के लिए पॉइंटर रखता है। इस बिंदु पर, मेरे पास केवल एक घटक व्युत्पन्न वर्ग है, जो Transform
वर्ग है। मैं यूनिटी के सम्मेलन के समान इस घटक आधारित आर्किटेक्चर को कार्यान्वित करना चाहता था: मैं सदस्य टेम्पलेट फ़ंक्शन को GetComponent<Transform>()
पर कॉल करके गेम ऑब्जेक्ट का एक घटक प्राप्त करना चाहता हूं।व्युत्पन्न वर्ग
यहाँ हेडर हैं:
Component.h
enum type{
TRANSFORM // more will be added later
};
class Component // base class
{
public:
Component() : _owner(NULL) {}
virtual ~Component(){}
static type Type;
protected:
GameObject* _owner;
};
Transform.h
class Transform : public Component
{
public:
Transform();
~Transform();
static type Type;
void Rotate(float deg);
// to be encapsulated later on
Vector2D _position;
float _rotation;
Vector2D _scale;
};
GameObject.h
class GameObject
{
public:
GameObject();
~GameObject();
void Update();
//and more member functions
template<class T>
T* GetComponent();
private:
// some more private members
unordered_map<type, Component*> _componentList; // only 1 component of each type
};
template<class T>
T* GameObject::GetComponent()
{
return static_cast<T*>(_componentList[T::Type]);
}
मेरे प्रारंभिक कार्यान्वयन Component*
रखने के लिए इस्तेमाल किया std::vector
और आवेदन (मैं भी एक फ्रेम दर नियंत्रक, जो सिर्फ 60 एफपीएस की सीमा है) 60 fps भाग गया। जब मैं उन घटक पॉइंटर्स तक पहुंचने के लिए unordered_map
में बदल गया, तो प्रदर्शन डाउनहिल 15 एफपीएस तक चला गया।
मैं केवल दो quads आकर्षित और मैं इस बिंदु पर फ्रेम प्रति GetComponent<Transform>()
केवल 6 बार फोन, इसलिए वहाँ ज्यादा दृश्य में चल रही नहीं है।
मैंने क्या प्रयास किया?
मैं unordered_map
के लिए महत्वपूर्ण मूल्यों के रूप में const char*
, std::string
, type_info
और अंत में enum type
उपयोग करने के लिए कोशिश की, लेकिन कुछ भी नहीं है वास्तव में मदद करता है: सभी कार्यान्वयन मुझे 15-16 एफपीएस मिला है।
इस प्रदर्शन समस्या का कारण क्या है? मैं इस मुद्दे को अलग कैसे कर सकता हूं?
मुझे आशा है कि मैं पर्याप्त विस्तार प्रदान की है, यदि आवश्यक हो तो अधिक कोड के लिए पूछने के लिए स्वतंत्र महसूस
इकाइयों में आमतौर पर केवल कुछ घटक होते हैं, शायद 5 या अधिकतम 30. 30 तत्वों के लिए रैखिक खोज वाले वेक्टर एक हैश_मैप से बेहतर प्रदर्शन करते हैं। मैं सिर्फ वैक्टर के साथ रहना होगा। – nwp
मुझे गेम प्रोग्रामिंग के बारे में कुछ भी पता नहीं है, लेकिन क्या आप हमेशा num_components तत्वों के साथ एक पॉइंटर सरणी को चालू नहीं कर सकते? प्रकार enum मान सरणी में सूचकांक के रूप में डाला जा सकता है, और यदि आपके पास कुछ घटक हैं तो यह उच्च स्मृति ओवरहेड नहीं हो सकता – dgel
आप और क्या बदल गए? मुझे विश्वास नहीं है * केवल * आपके घटकों के भंडारण कंटेनर को बदल दिया है। एक हैश मान की गणना तुच्छ है। जीपीयू को ड्रा निर्देश भेजने की लागत से कम। –