我有一個遊戲,我的對象總是圍繞中心點旋轉。問題是,當我一次調用20多個演員的rotateBy時,fps從60 fps下降到30。這是正常行爲嗎?如何旋轉30名演員導致這樣的FPS下降?Scene2d |在30個角色上調用rotateBy在android上導致低fps
編輯:我也應該想到,每個演員都有一個身體,並且燈具被銷燬並重新創建每一幀(因爲演員改變大小)。
編輯這裏是代碼,這被稱爲每個演員的每個幀。
private void createFixtures(boolean remove) {
if (remove) {
if (fixture_inner != null) {
if (body.getFixtureList().contains(fixture_inner, false)) {
body.destroyFixture(fixture_inner);
}
}
if (fixture_outer != null) {
if (body.getFixtureList().contains(fixture_outer, false)) {
body.destroyFixture(fixture_outer);
}
}
if (fixture_gap != null) {
if (body.getFixtureList().contains(fixture_gap, false)) {
body.destroyFixture(fixture_gap);
}
}
if (fixture_innerCircle != null) {
if (body.getFixtureList().contains(fixture_innerCircle, false)) {
body.destroyFixture(fixture_innerCircle);
}
}
if (fixture_outerCircle != null) {
if (body.getFixtureList().contains(fixture_outerCircle, false)) {
body.destroyFixture(fixture_outerCircle);
}
}
}
if (getInnerBounds() != null) {
FixtureDef fixtureDef_inner = new FixtureDef();
PolygonShape shape_inner = new PolygonShape();
shape_inner.set(getInnerBounds().getTransformedVertices());
fixtureDef_inner.shape = shape_inner;
fixtureDef_inner.filter.categoryBits = Config.CATEGORYBIT_BLOCKER;
fixtureDef_inner.filter.maskBits = Config.CATEGORYBIT_PLAYER;
fixtureDef_inner.isSensor = true;
fixture_inner = body.createFixture(fixtureDef_inner);
BlockerFixtureUserData fixtureUserData_inner = new BlockerFixtureUserData(this, gameObjects.indexOf(this, false));
fixture_inner.setUserData(fixtureUserData_inner);
shape_inner.dispose();
}
if (getInnerCircleBounds() != null) {
FixtureDef fixtureDef_circle = new FixtureDef();
PolygonShape shape_circle = new PolygonShape();
shape_circle.set(getInnerCircleBounds().getTransformedVertices());
fixtureDef_circle.shape = shape_circle;
fixtureDef_circle.filter.categoryBits = Config.CATEGORYBIT_BLOCKER;
fixtureDef_circle.filter.maskBits = Config.CATEGORYBIT_PLAYER;
fixtureDef_circle.isSensor = true;
fixture_innerCircle = body.createFixture(fixtureDef_circle);
BlockerFixtureUserData fixtureUserData_circle = new BlockerFixtureUserData(this, gameObjects.indexOf(this, false));
fixture_innerCircle.setUserData(fixtureUserData_circle);
shape_circle.dispose();
}
if (getOuterCircleBounds() != null) {
FixtureDef fixtureDef_circle = new FixtureDef();
PolygonShape shape_circle = new PolygonShape();
shape_circle.set(getOuterCircleBounds().getTransformedVertices());
fixtureDef_circle.shape = shape_circle;
fixtureDef_circle.filter.categoryBits = Config.CATEGORYBIT_BLOCKER;
fixtureDef_circle.filter.maskBits = Config.CATEGORYBIT_PLAYER;
fixtureDef_circle.isSensor = true;
fixture_outerCircle = body.createFixture(fixtureDef_circle);
BlockerFixtureUserData fixtureUserData_circle = new BlockerFixtureUserData(this, gameObjects.indexOf(this, false));
fixture_outerCircle.setUserData(fixtureUserData_circle);
shape_circle.dispose();
}
if (getOuterBounds() != null) {
FixtureDef fixtureDef_outer = new FixtureDef();
PolygonShape shape_outer = new PolygonShape();
shape_outer.set(getOuterBounds().getTransformedVertices());
fixtureDef_outer.shape = shape_outer;
fixtureDef_outer.filter.categoryBits = Config.CATEGORYBIT_BLOCKER;
fixtureDef_outer.filter.maskBits = Config.CATEGORYBIT_PLAYER;
fixtureDef_outer.isSensor = true;
fixture_outer = body.createFixture(fixtureDef_outer);
BlockerFixtureUserData fixtureUserData_outer = new BlockerFixtureUserData(this, gameObjects.indexOf(this, false));
fixture_outer.setUserData(fixtureUserData_outer);
shape_outer.dispose();
}
if (getGapBounds() != null) {
FixtureDef fixtureDef_gap = new FixtureDef();
PolygonShape shape_gap = new PolygonShape();
shape_gap.set(getGapBounds().getTransformedVertices());
fixtureDef_gap.shape = shape_gap;
fixtureDef_gap.filter.categoryBits = Config.CATEGORYBIT_BLOCKERGAP;
fixtureDef_gap.filter.maskBits = Config.CATEGORYBIT_PLAYER;
fixtureDef_gap.isSensor = true;
fixture_gap = body.createFixture(fixtureDef_gap);
BlockerFixtureUserData fixtureUserData_gap = new BlockerFixtureUserData(this, gameObjects.indexOf(this, false));
fixture_gap.setUserData(fixtureUserData_gap);
shape_gap.dispose();
}
}
您的演員是否使用Drawable繪製UI元素,還是直接繪製TextureRegions?某些Scene2d.UI元素在旋轉時會爲每個Actor導致批處理刷新。如果您的元素不是UI元素,請避免Drawable類並直接繪製TextureRegions。我沒有與Box2D的經驗知道你在那裏做什麼是一個沉重的行動。避免在渲染循環中使用Java'new'關鍵字,因爲這可能會導致大量垃圾回收。 – Tenfour04
@ Tenfour04我的演員正在使用精靈來渲染 – XPatStudios
請顯示一些代碼。具體來說就是創建和旋轉方法。 – IronMonkey