6

我正在制作一个使用粒子效果进行爆炸的 libGDX 游戏。这在新手机上运行得很好,但在旧手机(在 HTC Desire 上测试)上,当屏幕上出现多次爆炸时,fps 明显滞后。

我目前正在考虑两种选择:

  1. 每个效果有很多粒子,因此减少该数量可能是一种选择,但出于一致性和美学原因,我宁愿不这样做。

  2. 使用运行粒子效果生成的动画并保存每一帧。这看起来不错并且是一致的。图像大小可能存在问题。我也看不出如何使用 libGDX 粒子实现来完成此操作。

有任何想法吗?

编辑: 一些代码片段:在 Assets 类中加载效果后:

particleFire.load(Gdx.files.internal("explosion.p"),Gdx.files.internal(""));

我在弹丸对象的构造函数中加载粒子效果。我正在主渲染循环中创建这个对象,我知道这是优化的候选对象。

                explosion = new ParticleEffect(Assets.particleFire);

在渲染线程中调用此方法来绘制效果。

    private void drawBlasts(float delta){

    for(Missile projectile : world.missiles){
    if (projectile.missileState == State.EXPLODING){

        if(projectile.stateTime==0.0f) {
            projectile.explosion.start();
            continue;
        }

        projectile.explosion.setPosition(projectile.position.x, projectile.position.y);
        projectile.explosion.draw(spriteBatcher, delta);


    }
    }

}

一段爆炸.p

- Delay -
active: false
- Duration - 
lowMin: 1000.0
lowMax: 1000.0
- Count - 
min: 0
max: 100
- Emission - 
lowMin: 0.0
lowMax: 0.0
highMin: 250.0
highMax: 250.0
relative: false
scalingCount: 1
scaling0: 1.0
timelineCount: 1
timeline0: 0.0
- Life - 
lowMin: 800.0
lowMax: 800.0
highMin: 1000.0
highMax: 1000.0
relative: false
scalingCount: 3
scaling0: 1.0
scaling1: 1.0
scaling2: 1.0
timelineCount: 3
timeline0: 0.0
timeline1: 0.66
timeline2: 0.9931507

编辑2:这些效果是相加的,所以也有很好的混合。

4

1 回答 1

3

看看你的两个想法,它们都会起作用。第一个可以通过使粒子稍大并使用更少的粒子来解决。手机必须处理的粒子越少越好,因为每个粒子都是动态移动的,因此每帧滴答声会进行很多计算。

我觉得你的第二个选项会更好,因为没有/很少的处理时间(只需计算它的“爆炸”有多远并选择合适的框架。但是也有一个权衡,你所有的爆炸看起来都非常相似.如果您可以发布一些代码(您正在使用多少粒子,爆炸发生的频率,大致同时发生多少爆炸),那将会很有帮助。我有一个类似的问题,但更简单粒子效果,我通过渲染一个粒子效果并将其移动到每帧显示的任何地方来解决它

编辑 1: 好的,所以我认为您正在寻找的是粒子效果池。您基本上事先分配了一定数量的粒子效果,而不是像我相信的那样根据需要创建它们。通过重用固定池中的对象而不是单独分配和释放它们,您可以节省大量内存和处理。我尝试了我相信您在我的 Desire HD 上所做的事情,并且一次在屏幕上获得了大约 22 fps 和 12、1 秒 100 个奇怪的粒子效果。然后将它们汇集在一起​​,我得到了大约 25 个。这并不是非常好,但每一点都有帮助。甚至将粒子数减少到大约 75% 也不是很明显,并且可以为您节省很多帧!

粒子效果池 Libgdx JavaDoc

对不起,我无法提供更多帮助!

于 2012-11-05T17:28:57.627 回答