如何应用DOP并保持良好的用户界面?

Vit*_*Cpp 7 c++ caching vector relocation data-oriented-design

目前我想为控制台优化我的3D引擎.更确切地说,我希望更多的缓存友好,并使我的结构更加面向数据,但也希望保持我不错的用户界面.

例如:

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...
}
Run Code Online (Sandbox Code Playgroud)

因此用户可以在他的代码中使用接口指针.


在我的引擎中,我目前存储指向场景节点的指针.

boost::ptr_vector<SceneNode> m_nodes
Run Code Online (Sandbox Code Playgroud)

因此,在面向数据的设计中,最好使用数组结构而不是结构数组.所以我的节点来自......

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

std::vector<SceneNode> m_nodes;
Run Code Online (Sandbox Code Playgroud)

对...

class SceneNodes
{
  std::vector<std::string> m_names;
  std::vector<Math::Vec3d> m_positions;
  // and so on...
};
Run Code Online (Sandbox Code Playgroud)

所以如果我想申请DOP,我会在这里看到两个问题.首先,如何在不让用户使用ID,索引等的情况下保持良好的用户界面?

其次,当一些向量调整大小而不让用户界面指针指向必杀技时,如何处理属性的重定位?

目前我的想法是实现一种handle_vector,你可以从中获得持久性"指针"的句柄:

typedef handle<ISceneNodeData> SceneNodeHandle;
SceneNodeHandle nodeHandle = nodeHandleVector.get_handle(idx);
Run Code Online (Sandbox Code Playgroud)

因此,当实习生std :: vector调整大小时,它会更新其句柄."句柄"存储指向实际对象的指针," - >"运算符被重载以获得良好的包装.但这种方法对我来说听起来很复杂?!

你怎么看?如何保持一个漂亮的界面,但保持在内存中连续思考以获得更好的缓存使用?

谢谢你的帮助!

Mat*_* M. 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;
};
Run Code Online (Sandbox Code Playgroud)

一个非常好的观点:用户不能无意中调用delete你现在返回的指针之一.这就是智能手柄总是更好的原因.

另一方面:你如何处理指针的生命周期mManager是另一个问题:-)