2010-10-06 38 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

相关问题