簡體   English   中英

如何在C ++中實現一個場景圖,其中每個場景節點都可以引用多個子場景節點

[英]How to implement a Scene Graph in C++ where each Scene Node can refer to multiple child Scene Nodes

我目前正在嘗試將我的游戲引擎從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 ++風格的內存管理的初學者,因此任何幫助將不勝感激。

指針是實現您要執行的操作的好方法。 我認為您所擁有的正是您需要開始的。

僅僅因為您使用指針並不意味着您需要用“ new”動態創建SceneNode(盡管這是最簡單的入門方法)。 您可以使用節點池,也可以從靜態分配的節點創建指針。

我想做的是創建兩個函數-類似以下內容:

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

或將它們稱為CreateNode()和DestroyNode(),無論您使用什么術語。 使用這些函數獲取新節點並在完成后返回節點。 在后台,他們可以調用“ new”和“ delete”,但是在將來,如果您想切換到節點池(我建議用於游戲開發),則只需編輯這兩個功能即可。 整個SceneGraph不再動態分配,而是使用所需的任何內存管理模式。

哦,是的,如果您使用new,請確保在完成操作后刪除節點。 對於像樹這樣的層次結構,執行此操作的最簡單方法是(在SceneNode的析構函數中)在所有子級上調用delete。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM