当box2d的数量超过300时,移动设备的性能非常低

时间:2014-08-12 12:45:19

标签: java libgdx box2d

当我的世界/舞台上有300多具尸体时,我的表现非常低。在LG optimus 4x高清(Android 4.0.3)上,当我有少于50个机身时,我得到大约33 FPS然后60 FPS。

不确定是否是最佳方法,但我使用PoolableEnemyActor创建我的敌人以及我的粒子。当任何敌人死亡时,它会通过使用班级EnemyActor中的不同参数创建另外15个小团体作为粒子。

如果超出相机边界并且因为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);
    }

}

1 个答案:

答案 0 :(得分:2)

@LexWebb和@ iforce2d是对的。经过一些测试,我意识到我正在逐渐达到CPU限制。当然,有源box2d主体的数量因设备而异,以获得良好的性能。此外,如果可能,应审查和禁用任何联系。

我还在我的box2d粒子中添加了一个“生命周期”变量,以便更快地杀死它们并同时在屏幕上累积较少活动的物体。

现在它在旧手机(Android 2.3.3)上获得48到55 fps,在新手机上超过60 fps。

较少的颗粒等于较少的乐趣,但它仍然是令人愉快的。