2016-09-14 19 views
0

我有一個遊戲,我的對象總是圍繞中心點旋轉。問題是,當我一次調用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(); 
    } 
} 
+0

您的演員是否使用Drawable繪製UI元素,還是直接繪製TextureRegions?某些Scene2d.UI元素在旋轉時會爲每個Actor導致批處理刷新。如果您的元素不是UI元素,請避免Drawable類並直接繪製TextureRegions。我沒有與Box2D的經驗知道你在那裏做什麼是一個沉重的行動。避免在渲染循環中使用Java'new'關鍵字,因爲這可能會導致大量垃圾回收。 – Tenfour04

+0

@ Tenfour04我的演員正在使用精靈來渲染 – XPatStudios

+0

請顯示一些代碼。具體來說就是創建和旋轉方法。 – IronMonkey

回答

0

如果你破壞並重新固定裝置的每一個幀,你會做每秒約本次1800。與其摧毀並重新創建每一幀,您可以獨立於幀速率摧毀和重新創建燈具(即每秒10次,相當於30名演員每秒300次)。

這將顯着減少遊戲中發生的處理量,並且可以在大小之間進行插值,以便向用戶呈現流暢的動畫。

+0

這會使性能差異變大嗎? – XPatStudios

+0

但是,這是行不通的。我試過這種方法,燈具落在演員身後。 – XPatStudios