如何在C ++中实现场景图,其中每个场景节点都可以引用多个子场景节点

时间:2016-05-09 00:11:06

标签: java c++

我正在尝试将我的游戏引擎从Java移植到C ++,以便我使用更多最新版本的OpenGL。虽然它通常是一个非常流畅的过程(尽管使用C ++的经验很少),但在尝试移植 SceneNode 类时遇到了问题。

SceneNode类用于通过将父节点和子节点集合存储为成员来创建场景图。在Java中,SceneNode可以将另一个SceneNode(例如子节点)作为成员使用。但是,如果不使用指针,这在C ++中是不可能的。

所以,我的问题基本归结为:将SceneNode(或其集合)存储为另一个SceneNode成员的推荐方法是什么?

下面是一个草稿工具的示例,展示了我想要实现的目标的总体思路:

class SceneNode
{
public:

    //...
    // constructor, destructor etc
    //...

    void render(); // will call render() for each child node
    void addChild(SceneNode* child);

private:

    SceneNode* parent;
    std::vector<SceneNode*> children;

    //...
    // other members such as model data, transformation matrix etc
}

以上肯定不是一成不变的,我非常欢迎提出建议,这纯粹是为了示范。如果任何建议的实现需要额外的关注,例如专门的复制构造函数或析构函数,那么对我来说也是有用的。

我假设我需要使用new关键字来生成指针,如果可能的话,可能还有智能指针,但我是C ++风格内存管理的初学者,所以任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:-1)

指针是实现您想要做的事情的好方法。我认为你拥有的正是你需要开始的。

仅仅因为您使用指针并不意味着您需要使用“new”动态创建SceneNode(尽管这是最简单的入门方式)。您可以使用节点池,或者从静态分配的节点创建指针。

我喜欢做的是创建两个函数 - 类似于:

SceneNode * Alloc_SceneNode();
void Dealloc_SceneNode(SceneNode *node);

或者它们可以被称为CreateNode()和DestroyNode(),无论你想要什么术语。完成后,使用这些函数获取新节点并返回节点。在幕后,他们可以称之为“新”和“删除”,但将来如果您想切换到节点池(我建议用于游戏开发),很容易编辑这两个功能和繁荣。您的整个SceneGraph不再动态分配,它使用您想要的任何内存管理模式。

哦是的,如果您使用new,请确保在完成后删除节点。对树状结构(如树)执行此操作的最简单方法是(在SceneNode的析构函数中)对所有子项调用delete。