現在、コンソール用に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を適用する場合、ここで2つの問題が発生します。まず、ユーザーがIDやインデックスなどを操作しなくても、優れたユーザーインターフェイスを維持するにはどうすればよいでしょうか。
次に、一部のベクトルのサイズが変更されたときに、ユーザーインターフェイスポインターがニルヴァーナを指さないようにした場合に、プロパティの再配置を処理するにはどうすればよいですか?
現在の私の考えは、永続的な「ポインタ」のハンドルを取得する一種のhandle_vectorを実装することです。
typedef handle<ISceneNodeData> SceneNodeHandle;
SceneNodeHandle nodeHandle = nodeHandleVector.get_handle(idx);
したがって、インターンstd :: vectorのサイズが変更されると、ハンドルが更新されます。「ハンドル」は実際のオブジェクトへのポインタを格納し、「->」演算子は適切なラッピングを実現するためにオーバーロードされます。しかし、このアプローチは私には非常に複雑に聞こえますか?!
どう思いますか?優れたインターフェイスを維持しながら、キャッシュの使用率を高めるためにメモリ内で連続して考える方法はありますか?
助けてくれてありがとう!