2010-10-06 9 views
6

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!

+0

Co to jest "DOP" w używaniu? –

+0

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

Odpowiedz

5

Będziesz potrzebować mądrzejszych uchwytów niż surowych wskazówek. Nie ma możliwości obejścia tego z DOP.

To znaczy:

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; 
}; 

Jeden bardzo dobry punkt choć: użytkownik nie może przypadkowo wywołać delete na jednym wskaźniku wrócisz teraz. Dlatego inteligentne uchwyty są zawsze lepsze.

Z drugiej strony: jak idziesz do czynienia z trwania wskazywany z mManager jest inny problem :-)

+0

Tak, myślałem również w tym kierunku, ale nie wydaje mi się to zbyt eleganckie ... Ale myślę, że wybiorę takie rozwiązanie i ukryję indeksowanie od użytkownika. W moim projekcie wszyscy "menedżerowie" są globalni. Tak więc wystarczy prosty assert() w trybie debugowania, aby upewnić się, że mamy właściwego menedżera. Jest to duża wada DOP. Dziękuję Ci! – VitaminCpp

+0

@VitaminCpp: to nie jest żadna wada, o ile mi wiadomo, ponieważ zawsze używam inteligentnych uchwytów podczas projektowania interfejsu. Znacznie łatwiej ewoluować, mogą zawierać przejrzyste liczenie odwołań, chroni zawartość i może znacznie łatwiej zapewnić kompatybilność binarną. –

+0

Rzeczywiście jest to silny argument! Teraz najtrudniejszą częścią jest przebudowanie samego węzła sceny DOP ... :(Wielkie dzięki! – VitaminCpp

Powiązane problemy