私は開発者チームの巨大なアプリケーションの途中で、メモリは早い段階から検討するべきものです。このプログラムをそのまま実行すると、約44MBのメモリが必要になります(タスクマネージャから見つけられます)。それから私は10,000体を作ります。メモリ使用量は約83 MBになりました。私はスペースをクリックすると体を破壊する方法があります、これは見た目です。LibGdxでのメモリ使用量
public static void disposeAllBodies(){
Array<Body> bodies = new Array<Body>();
world.getBodies(bodies);
int destroyCount = 0;
System.out.println("Attempting to destroy " + world.getBodyCount()+ " bodies");
for(Body b : bodies){
world.destroyBody(b);
destroyCount++;
}
System.out.println("Successfully destroyed " + destroyCount + " body(s), " + world.getBodyCount() + " remain");
}
すべてのボディを問題なく処理しますが、これらはアプリケーション内の唯一のものです。それらが処分された後、メモリは約66MBに数秒間移動し、その後78MBまでジャンプしてそこにとどまります。
だから私はこれらのボディを処分するより良い方法があるのだろうか?このアプリケーションは数百万のボディを作成しますが、ほとんどが破壊されますが、メモリがちょうど上昇し続けると、メモリがかなり静的なままであるため、これを処理できなくなります。
また、CPUは0.2%(どのボディよりも前)から23%(10,000ボディが存在する場合)に続いて2.3%(ディスポーザルボディの場合)に減少します。だからCPUでも、身体を処分した後でもっと仕事をしています。
ありがとうございました!
更新:
BodyDef bodyDef = new BodyDef();
bodyDef.type = type;
bodyDef.position.set(new Vector2(position.x, position.y));
Body body = world.createBody(bodyDef);
FixtureDef fixtureDef = new FixtureDef();
Fixture fixture;
if(isCircle){
CircleShape circle = new CircleShape();
circle.setRadius(dimensions.x);
fixtureDef.shape = circle;
fixture = body.createFixture(fixtureDef);
circle.dispose();
}else{
PolygonShape rectangle = new PolygonShape();
rectangle.setAsBox(dimensions.x, dimensions.y);
fixtureDef.shape = rectangle;
fixture = body.createFixture(fixtureDef);
rectangle.dispose();
}
これらはすべてちょうどBOX2D本体、付属なしスプライトか何かがある:次のように体を作成するためのコードがある。ありがとう!
ボディを作成する際に使用するコードを含めることはできますか? –
あなたは作成/破棄しているbox2d本体ですか?ボディのUserDataに何か(Entity/Actorインスタンスのようなもの)を追加して解放/廃棄されないかもしれませんか?ボディ、特にフィクスチャを作成するときは、作成中に使用するシェイプオブジェクトをすべて破棄しますか? (例:shape = new PolygonShape(); etc; fixtureDef.shape = shape; shape.dispose();)。新しいテクスチャを作成していて、不要でどこにも配置しない場所ですか? –
更新された回答者 – Luke