java - 当 box2d 实体数量超过 300 时,在移动设备上的性能非常低

标签 java libgdx box2d

当我的世界/舞台上有超过 300 个物体时,我的表现一直很差。在 LG optimus 4x hd (Android 4.0.3) 上,我得到大约 33 FPS,然后当我的 body 少于 50 个时,我得到 60 FPS。

不确定这是否是最好的方法,但我使用我的 PoolableEnemyActor 来创建我的敌人和我的粒子。当任何敌人死亡时,它会使用 EnemyActor 类中的不同参数创建另外 15 个小物体作为粒子。

如果它们超出相机边界并且由于 Scene2d Stage 而不是在它之外绘制,则所有物体都会被销毁。

问题
- 在创作更多作品之前,我是否应该注意 body (适合手机)的数量限制?
- 我是否使用了正确的方法来创建 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 限制。当然,为了获得良好的性能, Activity box2d 主体的数量会因设备而异。此外,应审查任何联系人并在可能的情况下将其禁用。

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

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

颗粒越少,乐趣越少,但仍然很有趣。

关于java - 当 box2d 实体数量超过 300 时,在移动设备上的性能非常低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25264655/

相关文章:

c++ - 将 void * 转换回 struct 的麻烦

android - 快速移动的物体有时会错过 Box2d 和 AndEngine 中的碰撞

java - 获取未知类的 java bean 的属性

java - 减少 "if-else"循环的大小

java - NoSuchBeanException,即使定义了 Bean

java - Maven Netbeans 打开的文件太多

android-studio - libGDX 桌面应用程序 JAR 生成

LibGDX 帧缓冲

java - LibGDX unProject 返回错误值

C++ 类不生成匹配函数和已知转换错误