7

現在、コンソール用に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のサイズが変更されると、ハンドルが更新されます。「ハンドル」は実際のオブジェクトへのポインタを格納し、「->」演算子は適切なラッピングを実現するためにオーバーロードされます。しかし、このアプローチは私には非常に複雑に聞こえますか?!

どう思いますか?優れたインターフェイスを維持しながら、キャッシュの使用率を高めるためにメモリ内で連続して考える方法はありますか?

助けてくれてありがとう!

4

2 に答える 2

5

生のポインタよりもスマートなハンドルを使用する必要があります。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は別の問題です:-)

于 2010-10-06T14:03:01.947 に答える
1

DOPの実用的な例に興味のある方は、NiklasFrykholmによるこの素晴らしいプレゼンテーションをご覧ください=> http://bitsquid.blogspot.com/2010/05/practical-examples-in-data-ientified.html

これは、データ指向の方法でシーングラフを実装するのに役立ちました。

于 2010-10-06T20:30:26.113 に答える