Tôi đang cố triển khai kiến trúc dựa trên thành phần trên một dự án công cụ trò chơi. Mỗi GameObject có một số unordered_map
chứa con trỏ đến Component
lớp cơ sở. Tại thời điểm này, tôi chỉ có một lớp dẫn xuất thành phần, là lớp Transform
. Tôi muốn triển khai cấu trúc dựa trên thành phần này tương tự như quy ước của Unity: Tôi muốn lấy một thành phần của đối tượng trò chơi bằng cách gọi hàm thành viên mẫu như GetComponent<Transform>()
.Hiệu suất thấp từ unordered_map khi truy cập các phần tử trong hàm mẫu thành viên trong lớp dẫn xuất
Dưới đây là các tiêu đề:
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]);
}
thực hiện ban đầu của tôi sử dụng std::vector
để giữ Component*
và ứng dụng chạy ở 60 fps (Tôi cũng có một bộ điều khiển tốc độ khung hình, mà chỉ giới hạn FPS đến 60). Khi tôi đổi thành unordered_map
để truy cập vào các thành phần con trỏ đó, hiệu suất đã giảm xuống 15 FPS.
Tôi chỉ vẽ hai Quads và tôi chỉ gọi GetComponent<Transform>()
6 lần mỗi khung vào thời điểm này, do đó không được nhiều đang xảy ra trong bối cảnh đó.
Tôi đã thử gì?
Tôi cố gắng để sử dụng const char*
, std::string
, type_info
và cuối cùng enum type
như các giá trị quan trọng đối với các unordered_map
nhưng không thực sự giúp: mọi cài đặt đã cho tôi 15-16 FPS.
Điều gì gây ra vấn đề về hiệu suất này? Làm thế nào tôi có thể cô lập vấn đề?
Tôi hy vọng tôi cung cấp đủ chi tiết, đừng ngần ngại hỏi cho mã hơn nếu cần thiết
Thực thể thường chỉ có ít thành phần, có thể là 5 hoặc nhiều nhất là 30. Đối với 30 phần tử, một véc tơ có tìm kiếm tuyến tính hoạt động tốt hơn hash_map. Tôi sẽ chỉ dính vào vectơ. – nwp
Tôi không biết gì về lập trình trò chơi, nhưng bạn không thể khởi tạo một mảng con trỏ với các phần tử num_components luôn luôn? Các giá trị kiểu enum có thể được dùng làm chỉ mục vào mảng, và nếu bạn có vài thành phần, nó có thể không phải là chi phí bộ nhớ cao – dgel
bạn đã thay đổi gì khác? Tôi không tin bạn * chỉ * đã thay đổi vùng lưu trữ của các thành phần của bạn. tính toán giá trị băm là không đáng kể. thấp hơn chi phí gửi hướng dẫn vẽ tới GPU. –