0

私は c++ の初心者で、ゲームエンジン フレームワークの minko を使用しようとしています。Minko は shared_ptr を非常に過度に使用しており、一般的な c++ *ptr ロジックをエスケープしているように見えるため、それらがどのように機能するかを理解するのに問題があります。

初期化フェーズのどこかで、canvas、sceneManager、rootNode オブジェクトなど、いくつかのオブジェクトが作成され、メンバー関数を介して取得されます。私はそれらすべてを Game クラス内で結び付けようとしています。このクラスには、いくつかのゲーム ロジックは別として、これらの重要なエンジン オブジェクトのそれぞれへのポインターが含まれている必要があります。

関数呼び出しが機能せず、何も起こらなかったため、これを機能させるための最初の試みでオブジェクトが重複するという問題が発生しました。いくつかのデバッグの後、ポインター割り当ての後に printf 関数を追加して、それらが実際に指している場所と異なるメモリ アドレスを指していることを確認しました。

オブジェクトから始めましょう。

std::shared_ptr<minko::Canvas> canvas = Canvas::create("RenderTarget", 1280, 1024);
std::shared_ptr<minko::component::SceneManager> sceneManager = SceneManager::create(canvas->context());
std::shared_ptr<minko::scene::Node> root = scene::Node::create("root")
    ->addComponent(sceneManager);

これらのオブジェクトにはすべて ::Ptr メンバー属性が含まれており、ポインターが直接含まれているようです。shared_ptr ドキュメントでこれに関する参照が見つからなかったので、これはゲーム エンジンに固有のものであると思われます。

これで Game クラスができました:

class Game
{
    minko::Canvas::Ptr _canvas;
    minko::scene::Node _root;
    minko::component::SceneManager _sceneManager;
}

そして、上記のオブジェクトが作成される同じ関数のどこかに、割り当て:

_canvas = canvas;
_root = root;
_sceneManager = sceneManager;

各変数の前後にさまざまな * と & の組み合わせを試し、ポインター、直接値、ポインターポインターのあらゆる種類の組み合わせを試しましたが、2 つのデバッグ呼び出しに到達するたびに:

printf("MEMTEST: canvas: %p vs %p , root: %p vs %p , scenemgr: %p vs %p\n", _canvas, canvas, _root, root, _sceneManager, sceneManager);
printf("MEMTEST: canvas: %X vs %X , root: %X vs %X , scenemgr: %X vs %X\n", _canvas, canvas, _root, root, _sceneManager, sceneManager);

メモリ値が異なっていたため、同じオブジェクトを指していないと思いました。

さて、ここからどこへ行こうか?ドキュメンテーションはあまり役に立ちませんでした。まだ完全には理解していない膨大な量の情報があり、私が見つけたこれらの Web サイトはすべて、私がまだ持っていない膨大な量の C++ の知識を必要としているようです。これを理解するには、5 年以上の C++ の知識を蓄積するよりも簡単な方法が必要です。

4

2 に答える 2

3

_rootポインターで_sceneManagerはなく、オブジェクトとして宣言されています。関数で作成した同じオブジェクトを参照することはありませんcreate

私はライブラリに精通していませんが、Ptr既に_canvas.

class Game
{
    minko::Canvas::Ptr _canvas;
    minko::scene::Node::Ptr _root;
    minko::component::SceneManager::Ptr _sceneManager;
}
于 2014-12-08T12:38:46.583 に答える
1

関数を使用して、ステートメントstd::shared_ptr::get()で管理オブジェクト ポインターにアクセスします。printf()

printf("MEMTEST: canvas: %p vs %p , root: %p vs %p , scenemgr: %p vs %p\n"
      , _canvas.get(), canvas.get()
      , _root.get(), root.get()
      , _sceneManager.get(), sceneManager.get());
printf("MEMTEST: canvas: %X vs %X , root: %X vs %X , scenemgr: %X vs %X\n"
      , _canvas.get(), canvas.get()
      , _root.get(), root.get()
      , _sceneManager.get(), sceneManager.get());

それらはそのままでは、shared_ptr<>インスタンスから何かを比較するために、かなり役に立ちません。

于 2014-12-08T12:35:58.417 に答える