Obecnie chcę zoptymalizować mój silnik 3d na konsole. Dokładniej chcę być bardziej przyjazny dla pamięci podręcznej i dostosować moje struktury bardziej zorientowane na dane, ale także chcę zachować mój miły interfejs użytkownika.Jak zastosować DOP i zachować ładny interfejs użytkownika?
Na przykład:
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...
}
Dzięki temu użytkownik może pracować z wskaźniki interfejsu w jego kodzie.
ALE
W moim silniku przechowuje obecnie wskaźniki do węzłów sceny.
boost::ptr_vector<SceneNode> m_nodes
W przypadku projektowania zorientowanego na dane dobrze jest mieć strukturę tablic, a nie tablic struktur. Więc mój węzeł dostaje od ...
class SceneNode
{
private:
Math::Vec3d m_pos;
};
std::vector<SceneNode> m_nodes;
do tego ...
class SceneNodes
{
std::vector<std::string> m_names;
std::vector<Math::Vec3d> m_positions;
// and so on...
};
Widzę dwa problemy tutaj, jeśli chcę zastosować DOP. Po pierwsze, w jaki sposób mogę zachować przyjemny interfejs użytkownika bez konieczności używania identyfikatorów, indeksów itp.?
Po drugie, w jaki sposób poradzić sobie z relokacjami właściwości, gdy niektóre wektory zmieniają rozmiar, nie pozwalając użytkownikom wskazywać na nirwanę?
Obecnie mój pomysł jest wprowadzenie pewnego rodzaju handle_vector, z którego można dostać uchwyt dla wytrwałych „wskazówek”:
typedef handle<ISceneNodeData> SceneNodeHandle;
SceneNodeHandle nodeHandle = nodeHandleVector.get_handle(idx);
Więc gdy stażysta std :: vector zmienia rozmiar, aktualizuje jego uchwyty. "Uchwyt" przechowuje wskaźnik do rzeczywistego obiektu, a operator "->" jest przeciążany, aby uzyskać ładne opakowanie. Ale to podejście wydaje mi się skomplikowane ?!
Co myślisz? Jak zachować przyjemny interfejs, ale zachować ciągłe myślenie w pamięci dla lepszego wykorzystania pamięci podręcznej?
Dzięki za wszelką pomoc!
Co to jest "DOP" w używaniu? –
Programowanie zorientowane na dane to w moim przypadku konwersja z tablic-struktur do struktury-tablic. Wirtualna metoda Update() zostaje wyciągnięta z SceneNode, a następnie jest członkiem struktury SceneNodes. Mogę więc przejść liniowo przez moje tablice, w których jestem zainteresowany. – VitaminCpp