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调整大小时,它会更新其句柄."句柄"存储指向实际对象的指针," - >"运算符被重载以获得良好的包装.但这种方法对我来说听起来很复杂?!
你怎么看?如何保持一个漂亮的界面,但保持在内存中连续思考以获得更好的缓存使用?
谢谢你的帮助!
您将需要使用比原始指针更智能的句柄.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
是另一个问题:-)
归档时间: |
|
查看次数: |
2407 次 |
最近记录: |