質問

現在、コンソール用に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

これにより、データ指向の方法でシーングラフを実装することができました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top