当我的世界/舞台上有超过 300 个物体时,我的表现一直很差。在 LG optimus 4x hd (Android 4.0.3) 上,我得到大约 33 FPS,然后当我的 body 少于 50 个时,我得到 60 FPS。
不确定这是否是最好的方法,但我使用我的 Poolable
类 EnemyActor
来创建我的敌人和我的粒子。当任何敌人死亡时,它会使用 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/