c++ - 分层组件存储结构

标签 c++ stl

几天来我一直在思考这个问题,但没有得出任何令人满意的结论,所以我想我应该征求 SO 团队的意见。对于我正在开发的游戏,我正在使用组件对象模型,如 here 所述和 here .它实际上进行得相当顺利,但我当前的存储解决方案被证明是有限的(我只能通过类名或任意“系列”名称请求组件)。我想要的是请求给定类型并遍历该类型的所有组件或从该类型派生的任何类型的能力。

考虑到这一点,我首先实现了一个简单的 RTTI 方案,该方案按该顺序通过派生类型存储基类类型。这意味着,比方说,一个 Sprite 的 RTTI 将是:component::renderable::sprite。这允许我通过比较 B 的所有元素轻松地比较类型,看看类型 A 是否派生自类型 B:即 component::renderable::sprite 派生自 component::renderable 而不是 component::timer。简单、有效且已实现。

我现在想要的是一种以表示该层次结构的方式存储组件的方法。首先想到的是使用类型作为节点的树,如下所示:

       component
       /       \
  timer         renderable
  /              /      \
shotTimer   sprite      particle

在每个节点,我都会存储该类型所有组件的列表。这样,请求“component::renderable”节点将使我能够访问所有可渲染组件,而不管派生类型如何。问题是我希望能够使用迭代器访问这些组件,这样我就可以做这样的事情:

for_each(renderable.begin(), renderable.end(), renderFunc);

并让它从可渲染向下遍历整个树。我使用一个非常丑陋的 map /vector/树节点结构和一个跟踪我去过的节点堆栈的自定义前向迭代器来完成这项工作。不过,在实现过程中,我一直觉得一定有更好、更清晰的方法……我只是想不出一个 :(

所以问题是:我是否不必要地把它复杂化了?是否有一些我遗漏的明显简化,或者我应该使用的预先存在的结构?或者这只是一个复杂的问题,我可能已经做得很好了?

感谢您的任何意见!

最佳答案

您应该考虑您需要多久执行一次以下操作:

  • 遍历树
  • 从树中添加/删除元素
  • 你需要跟踪多少对象

哪个更频繁有助于确定最优解

也许不用制作复杂的树,只需拥有所有类型的列表,并为每个类型派生的对象添加一个指针。像这样:

map<string,set<componenet *>>  myTypeList

然后对于类型为 component::renderable::sprite 的对象

myTypeList["component"].insert(&object);
myTypeList["renderable"].insert(&object);
myTypeList["sprite"].insert(&object);

通过在多个列表中注册每个对象,然后可以很容易地对给定类型和子类型的所有对象做一些事情

for_each(myTypeList["renderable"].begin(),myTypeList["renderable"].end(),renderFunc);

请注意,std::set 和我的 std::map 构造可能不是最佳选择,具体取决于您将如何使用它。

或者也许是一种仅在树中存储类层次结构的混合方法

map<string, set<string> > myTypeList;
map<string, set<component *> myObjectList;

myTypeList["component"].insert("component");
myTypeList["component"].insert("renderable");
myTypeList["component"].insert("sprite");
myTypeList["renderable"].insert("renderable");
myTypeList["renderable"].insert("sprite");
myTypeList["sprite"].insert("sprite");

// this isn't quite right, but you get the idea
struct doForList {
    UnaryFunction f;
    doForList(UnaryFunction f): func(f) {};
    operator ()(string typename) { 
       for_each(myTypeList[typename].begin();myTypeList[typename].end(), func);
   }
}

for_each(myTypeList["renderable"].begin(),myTypeList["renderable"].end(), doForList(myFunc))

关于c++ - 分层组件存储结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/750087/

相关文章:

c++ - 在类的构造函数初始值设定项中填充 std::array

c++ - C++中的细粒度锁定队列

c++ - public: typedef other_class::const_iterator my_class::const_iterator - 可以接受吗?

c++ - 无法破译来自链接器的错误

android - OpenCV 3.0.0 OpenCVEngine接口(interface)

c++ - 为什么构造 std::string(0) 不会发出编译器警告?

c++ - 具有通用索引类型的数组

c++ - 检查下一个元素是否是 STL 列表中的最后一个元素

c++ - 如何在 C/C++ 中使用磁带进行操作?

c++ - 没有匹配函数调用 'Book::Book()'