Actuellement, je souhaite optimiser un peu mon moteur 3D pour les consoles. Plus précisément, je veux être plus compatible avec le cache et aligner mes structures plus orientées vers les données, mais je veux aussi conserver ma belle interface utilisateur.
Par exemple :
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...
}
L'utilisateur peut donc travailler avec des pointeurs d'interface dans son code.
MAIS
Dans mon moteur, je stocke actuellement des pointeurs vers les nœuds de la scène.
boost::ptr_vector<SceneNode> m_nodes
Dans le cadre d'une conception orientée données, il est donc préférable d'avoir des structures de tableaux et non des tableaux de structures. Ainsi, mon nœud obtient de...
class SceneNode
{
private:
Math::Vec3d m_pos;
};
std::vector<SceneNode> m_nodes;
à cela...
class SceneNodes
{
std::vector<std::string> m_names;
std::vector<Math::Vec3d> m_positions;
// and so on...
};
Je vois donc deux problèmes si je veux appliquer la DOP. Tout d'abord, comment puis-je conserver mon interface utilisateur agréable sans que l'utilisateur ait à travailler avec des ID, des index, etc.
Deuxièmement, comment gérer la relocalisation des propriétés lorsque certains vecteurs sont redimensionnés sans laisser les pointeurs de l'interface utilisateur pointer vers le nirvana ?
Actuellement, mon idée est d'implémenter une sorte de handle_vector à partir duquel on obtient un handle pour les "pointeurs" persistants :
typedef handle<ISceneNodeData> SceneNodeHandle;
SceneNodeHandle nodeHandle = nodeHandleVector.get_handle(idx);
Ainsi, lorsque le std::vector interne se redimensionne, il met à jour ses handles. Un "handle" stocke un pointeur sur l'objet réel et l'opérateur "->" est surchargé pour réaliser un joli wrapping. Mais cette approche me semble un peu compliquée !
Qu'en pensez-vous ? Comment conserver une interface agréable, mais garder les pensées contiguës en mémoire pour une meilleure utilisation du cache ?
Merci de votre aide !