我處於開發人員團隊中的一個巨大應用程序的中間,內存需要儘早考慮。當我按原樣運行程序時,需要大約44 MB的內存(從任務管理器中找到)。然後我創建了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幾秒鐘,然後跳到78 MB並停留在那裏。
所以我想知道是否有更好的方法來處理這些屍體?這個應用程序將創建數百萬個物體,但大多數物體會被破壞,但是如果內存持續增長,它將無法處理這麼多的處理,因爲內存保持非常靜態。另外,CPU從0.2%(在任何機構之前)變爲23%(當10,000個機構出現時),然後從當前的2.3%(當處置機構時)變爲0.2%。所以即使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正在創建/銷燬的機構?你是否添加了任何東西(比如Entity/Actor實例)到身體的UserData中,這些東西可能不會被釋放/丟棄?當你創建你的身體,特別是燈具時,你是否會破壞創建時使用的任何形狀對象? (例如shape = new PolygonShape(); etc; fixtureDef.shape = shape; shape.dispose();)。你是否在任何不需要的地方創建新的紋理並且不處理? –
最新回答傢伙 – Luke