Как применить DOP и сохранить приятный пользовательский интерфейс?

Сейчас я хочу немного оптимизировать свой 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 изменяет размер, он обновляет свои дескрипторы. «Дескриптор» хранит указатель на фактический объект, а оператор «->» перегружен, чтобы получить красивую упаковку. Но мне такой подход кажется сложным?!

Как вы думаете? Как сохранить приятный интерфейс, но при этом сохранять мысли непрерывными в памяти для лучшего использования кеша?

Спасибо за любую помощь!

7
задан VitaminCpp 6 October 2010 в 12:23
поделиться