DOPを適用し、素敵なユーザーインターフェイスを保持する方法は?
-
28-09-2019 - |
質問
現在、コンソール用に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、インデックスなどを使用することなく、素敵なユーザーインターフェイスを維持するにはどうすればよいですか?
第二に、ユーザーがポインターをインターフェイスしてもNirvanaを指し示すことなく、一部のベクトルがサイズを変更した場合、プロパティの再配置を処理するにはどうすればよいですか?
現在、私のアイデアは、永続的な「ポインター」のハンドルを手に入れるハンドル_Vectorの一種を実装することです。
typedef handle<ISceneNodeData> SceneNodeHandle;
SceneNodeHandle nodeHandle = nodeHandleVector.get_handle(idx);
したがって、インターンSTD :: Vectorがサイズを変更すると、ハンドルを更新します。 「ハンドル」は実際のオブジェクトへのポインターを保存し、「 - >」演算子はオーバーロードされて素敵なラッピングをします。しかし、このアプローチは私には複雑なビスのように聞こえますか?!
どう思いますか?優れたインターフェイスを維持するにはどうすればよいですか。しかし、キャッシュの使用を改善するために、メモリに隣接していると考え続けていますか?
助けてくれてありがとう!
解決
生のポインターよりもスマートなハンドルを使用する必要があります。 DOPでそれを回避する方法はありません。
これの意味は:
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;
};
しかし、1つの非常に良い点:ユーザーは誤って電話することができません delete
ポインターの1つで、あなたは今戻ってきました。だからこそ、スマートハンドルは常に優れています。
一方、あなたはどのようにのポーニーの生涯に対処するつもりですか mManager
別の問題です:-)
他のヒント
DOPの実用的な例に興味がある人のために、Niklas Frykholm =>のこの素晴らしいプレゼンテーションをご覧ください。 http://bitsquid.blogspot.com/2010/05/practical-examples-in-data-oriented.html
これにより、データ指向の方法でシーングラフを実装することができました。