Сейчас я хочу немного оптимизировать свой 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. Во-первых, как я могу сохранить свой приятный пользовательский интерфейс без того, чтобы пользователь работал с идентификаторами, индексами и т. Д.?
Во-вторых, как мне обрабатывать перемещение свойств, когда некоторые векторы изменяют размер, не позволяя указателям пользовательского интерфейса указывать на нирвану?
В настоящее время моя идея состоит в том, чтобы реализовать своего рода handle_vector, из которого вы получаете дескриптор для постоянных «указателей»:
typedef handle<ISceneNodeData> SceneNodeHandle;
SceneNodeHandle nodeHandle = nodeHandleVector.get_handle(idx);
Итак, когда intern std :: vector изменяет размер, он обновляет свои дескрипторы. «Дескриптор» хранит указатель на фактический объект, а оператор «->» перегружен, чтобы получить красивую упаковку. Но мне такой подход кажется сложным?!
Как вы думаете? Как сохранить приятный интерфейс, но при этом сохранять мысли непрерывными в памяти для лучшего использования кеша?
Спасибо за любую помощь!