-1

私は現在、Android で OpenGL ES 2.0 を使用するゲームに取り組んでいます (NDK を使用する C++ で)。

OpenGLを使用してオブジェクトを描画するための基本クラスである「Drawable」というクラスがあります。クラスのデストラクタで、いくつかのバッファをクリーンアップする必要があります:

Drawable::~Drawable() {
LOGE("release");
releaseBuffers();
}

しかし、デストラクタは(スレッドのすべてのループのように)際限なく呼び出され、私の図面が台無しになります。

私はここでちょっと迷っており、同様の問題を見つけることができなかったので、助けを歓迎します!

編集:ループコードはこちら:リンク

Edit2: 邪悪な呼び出しの 1 つを見つけました:

私のプレーヤークラスでは、次の呼び出しがあります。

currentWeapon->draw(this); 

void Weapon::draw(Player* p)

これにコメントすると、スパムはなくなります。

4

1 に答える 1

1

デストラクタが呼び出される方法はほとんどありません。

1) スタック上に のインスタンスを作成するDrawableと、スコープ外になります。これがタイトなループで行われると、オブジェクトは範囲外になり、ループの反復ごとに破棄されます。例えば:

for (size_t i = 0; i < 100; ++i)
{
  Drawable d;
}

ここでは、各ループの開始時と終了時に の 100 個のインスタンスDrawableが作成および破棄されます。

2)delete動的に割り当てられたDrawable:

for (size_t i = 0; i < 100; ++i)
{
  Drawable* d = new Drawable;
  delete drawable;
}

3) デストラクタを明示的に呼び出します。

Drawable* b = new (buffer) Drawable;
b->~Drawable()

#3 は「placement new」を使用しており、その可能性は非常に低いことに注意してください。


オブジェクトは、vector. 検討:

vector <Drawable> drawables;
for (size_t i = 0; i < 10000; ++i)
{
  Drawable d;
  drawables.push_back (d);
}

このコードを実行すると、潜在的に多くのデストラクタ呼び出しに気付くでしょう。するとpush_back、コピーが作成される可能性があり、オリジナル (dここ) は破棄されます。また、vector容量に達すると、再割り当てする必要があり、その結果、すべてのアイテムが再度コピーされ、元のアイテムが破棄されます。


オブジェクトは、一時的なコピーや予期しないコピーに直面して、驚くべき時に破壊されることもあります。検討:

void DoSomething (Drawable d)
{
}

int main()
{
  Drawable d;
  for (size_t i = 0; i < 1000; ++i)
  {
    DoSomething (d);
  }
}

この場合、コンパイラは一時変数を除外する可能性が高いため、これは単純な例です。しかし、DoSomething()を取るため、元のコピーを作成できます。他のコードによっては、コンパイラはこのコピーを除外することさえできない場合があります。Drawable

于 2013-07-11T15:10:06.457 に答える