2010-10-06 45 views
6

目前我想優化我的控制檯的3d引擎一點。更確切地說,我希望更好地緩存緩存,並使我的結構更加面向數據,但也希望保持良好的用戶界面。如何應用DOP並保持良好的用戶界面?

例如:

bool Init() 
{ 
    // Create a node 
    ISceneNode* pNode = GetSystem()->GetSceneManager()->AddNode("viewerNode"); 

    // Create a transform component 
    ITransform* pTrans = m_pNode->CreateTransform("trans"); 
    pTrans->SetTranslation(0,1.0f,-4.0f); 
    pTrans->SetRotation(0,0,0); 

    // Create a camera component 
    ICamera* pCam = m_pNode->CreateCamera("cam", pTrans); 
    pCam->LookAt(Math::Vec3d(0,0,0)); 

    // And so on... 
} 

所以用戶可以在自己的代碼接口指針工作。


在我的引擎我目前存儲指向場景節點。

boost::ptr_vector<SceneNode> m_nodes 

所以在面向數據的設計中,具有數組結構而不是結構數組是很好的做法。所以,我的節點會從...

class SceneNode 
{ 
private: 
    Math::Vec3d m_pos; 
}; 

std::vector<SceneNode> m_nodes; 

這個...

class SceneNodes 
{ 
    std::vector<std::string> m_names; 
    std::vector<Math::Vec3d> m_positions; 
    // and so on... 
}; 

所以我在這裏看到了兩個問題,如果我想申請DOP。 首先,我如何讓用戶界面不會讓用戶使用ID,索引等?

其次,如何讓一些向量調整大小而不讓用戶界面指針指向涅ana時如何處理屬性的重定位?

目前我的想法是實現一種handle_vector從中你得到一個句柄老大難「指針」:

typedef handle<ISceneNodeData> SceneNodeHandle; 
SceneNodeHandle nodeHandle = nodeHandleVector.get_handle(idx); 

所以當實習生的std ::向量調整大小,更新其手柄。 「句柄」存儲一個指向實際對象的指針,並且「 - >」操作符被重載以實現一個很好的包裝。但是這種方法對我來說聽起來有點複雜?!

您認爲如何?如何保持一個漂亮的界面,但保持認爲在內存連續更好的緩存使用?

感謝您的幫助!

+0

什麼是DOP在你的使用? – 2010-10-06 16:50:06

+0

在我的例子中,面向數據的編程是從數組結構到數組結構的轉換。 虛擬Update()方法從SceneNode中被取出,然後是SceneNodes結構的成員。所以我可以對我感興趣的陣列進行線性調整。 – VitaminCpp 2010-10-06 17:19:03

回答

5

您需要使用比原始指針更智能的句柄。 DOP沒有辦法解決這個問題。

這意味着:

class SceneNode 
{ 
public: 
    std::string const& getName() const { mManager->getSceneName(mId); } 
    void setName(std::string const& name) { mManager->setSceneName(mId, name); } 

    // similar with other data 
private: 
    ISceneManager* mManager; 
    size_t mId; 
}; 

一個很好的觀點,但:用戶不能撥打意外的delete你現在返回的指針之一。這就是爲什麼智能手柄總是更好。

在另一方面:你打算怎麼處理的mManager指針對象的生命週期是:-)

+0

是的,我也認爲這個方向,但它似乎不是很優雅,但我想我會選擇這樣的解決方案,並隱藏用戶的索引。在我的設計中,所有「經理」都是全球性的。所以一個簡單的assert()在調試模式下確保我們有一個有效的管理器就足夠了。這是DOP的一大缺點。謝謝! – VitaminCpp 2010-10-06 14:12:12

+0

@VitaminCpp:就我而言,這不是一個真正的缺點,因爲在設計界面時我總是使用智能手柄。更容易進化,可以包含透明引用計數,保護內容並可以更容易地提供二進制兼容性。 – 2010-10-06 14:34:27

+0

事實上,這是一個有力的論據!現在最難的部分是改造場景節點本身DOP ...... :(非常感謝! – VitaminCpp 2010-10-06 14:46:00

相關問題