目前,我想对控制台优化我的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...
}

因此,用户可以在其代码中使用接口指针。


在我的引擎中,我目前将指针存储到场景节点上。

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,索引等的情况下保持良好的用户界面?

其次,当某些向量调整大小而不让用户接口指针指向涅rv时,我该如何处理属性的重新定位?

目前,我的想法是实现一种句柄_vector,您可以从中获得持久的“指针”的手柄:

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

因此,当实习生STD ::向量调整大小时,它会更新其手柄。 “句柄”存储了指向实际对象的指针,并且“ - >”运算符被超载以实现一个不错的包装。但是这种方法对我来说听起来很复杂吗?

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

谢谢你的帮助!

有帮助吗?

解决方案

您需要使用比原始指针更智能的手柄。 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 在您现在返回的指针之一上。这就是为什么智能手柄总是更好的原因。

另一方面:您将如何处理Pointee的一生 mManager 是另一个问题:-)

其他提示

对于那些对DOP的实践示例感兴趣的人,请看一下Niklas Frykholm =>的这个奇妙的演讲 http://bitsquid.blogspot.com/2010/05/practical-examples-in-data-oriented.html

这有助于我以面向数据的方式实现场景图。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top