[英]Very low performance on mobile devices when the quantity of box2d bodies is over 300
當我的世界/舞台上有300多具屍體時,我的表現非常低。 在LG optimus 4x高清(Android 4.0.3)上,當我有少於50個機身時,我得到大約33 FPS然后60 FPS。
不確定是否是最好的方法,但我使用我的Poolable
類EnemyActor
創造我的敵人和我的粒子。 當任何敵人死亡時,它會通過使用EnemyActor
類中的不同參數創建另外15個小體作為粒子。
如果它們超出相機邊界並因為Scene2d Stage
沒有被繪制在它之外,則所有Scene2d Stage
都會被Scene2d Stage
。
問題
- 在制作更多之前我應該留意的身體是否有限制(適用於手機)?
- 我是否使用正確的方法來創建box2d粒子?
更新1
結合之間是:
- 敵人和地面
- 敵人粒子和gound
- 敵人粒子和敵人
- 敵人自己
- 子彈和敵人
這是我班EnemyActor
的相關部分:
public class EnemyActor extends Actor implements Poolable{
private World world;
private Body mBody = null;
private Sprite mSprite = null;
public static Vector2 position;
private BodyType bodyType = BodyType.DynamicBody;
private short category = Constants.CATEGORY_ENEMY;
private short mask = Constants.MASK_ENEMY;
private float width = (float)0.4f;
private float height = (float)0.4f;
private float angle = 0;
private float radius = 2f;
private boolean alive;
public boolean isParticle = false;
public int life = 1;
public EnemyActor(World world) {
this.world = world;
this.setAlive(false);
}
@Override
public void act(float delta) {
super.act(delta);
if(mBody != null){
if(life == 0 || mBody.getPosition().x < -10 || mBody.getPosition().x > 18 )
alive = false;
}
}
}
public void init(boolean isParticle,Vector2 newPosition) {
if(!isParticle){
//initiate enemy
} else{
//initiate enemyParticle
}
this.isParticle = isParticle;
}
@Override
public void reset() {
setAlive(false);
n_hits = 0;
isParticle = false;
life = 1;
}
@Override
public void draw(Batch batch, float parentAlpha) {
}
private void create_body() {
mBody = Box2dFactory.createCircleBody(world, position, bodyType, radius, category, mask);
}
}
@LexWebb和@ iforce2d是對的。 經過一些測試,我意識到我正在逐漸達到CPU限制。 當然,有源box2d主體的數量因設備而異,以獲得良好的性能。 此外,如果可能,應審查和禁用任何聯系人。
我還為我的box2d粒子添加了一個“生命周期”變量,以便更快地殺死它們並同時在屏幕上積累較少活動的物體。
現在它在舊手機(Android 2.3.3)上獲得48到55 fps,在新手機上獲得超過60 fps。
較少的顆粒等於較少的樂趣,但它仍然是愉快的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.