我最近一直在为我的游戏引擎实现一个实体组件系统。每个实体都有一个这样的组件映射:
组件.h
enum COMPONENT_INFO {
COMPONENT_POSITION = 0,
COMPONENT_PHYSICS,
COMPONENT_RENDERABLE
};
实体.h
class Entity {
public:
std::bitset<NUM_COMPONENTS> componentBits;
std::map<COMPONENT_INFO, Component*> components;
..
..
Component *getComponent(COMPONENT_INFO inf) {
return components[inf];
}
};
我的 System 类会像这样更新每帧的每个实体:
void update(Entity *e, float delta) {
PositionComponent *cmp=(PositionComponent*)e->getComponent(COMPONENT_INFO::COMPONENT_PHYSICS);
//x += 1.0f;
cmp->x += 1.0f;
}
一切都按预期工作,但我在访问地图时遇到了巨大的性能问题。当我创建 10000 个实体并迭代它们(系统实际上迭代)时,我得到 80 FPS 和蓝色空白系统(没有视觉效果,只是纯屏幕)。但是当我注释掉访问部分并只使用x += 1.0f;
时,FPS 会惊人地增加到 1000。就像这样:
void update(Entity *e, float delta) {
x += 1.0f; //btw the system has a local x value.
}
所以问题只是通过地图访问组件。我还能在这样的系统上使用什么?或者我在访问地图时做错了什么?
重要编辑:这只是一个测试驱动器,我的意思是每个实体可能有很多组件,而不仅仅是 3 个。我写这些只是为了测试目的。