我正在制作一个使用粒子效果进行爆炸的libGDX游戏.这在新手机上运行得相当不错,但在老款手机上(在HTC Desire上测试),当屏幕上有多个爆炸时fps显着滞后.
我目前正在考虑两种选择:
每个效果都有很多粒子,所以减少这个数量可能是一个选择,但我宁愿不是因为一致性和美学原因.
使用通过运行粒子效果生成的动画并保存每个帧.这看起来不错,而且会保持一致.图像大小可能存在问题.我也看不出如何使用libGDX粒子实现来完成这项工作.
有任何想法吗?
编辑: 代码的一些片段:在Assets类中加载效果后:
particleFire.load(Gdx.files.internal("explosion.p"),Gdx.files.internal(""));
Run Code Online (Sandbox Code Playgroud)
我在粒子对象的构造函数中加载粒子效果.我正在主渲染循环中创建这个对象,我知道它是优化的候选者.
explosion = new ParticleEffect(Assets.particleFire);
Run Code Online (Sandbox Code Playgroud)
在渲染线程中,调用此方法来绘制效果.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
爆炸片.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
Run Code Online (Sandbox Code Playgroud)
编辑2:这些效果是附加的,所以也有很多混合.
看看你的两个想法,它们都会起作用。第一个问题可以通过使粒子稍大一些并使用更少的粒子来解决。手机必须处理的粒子越少越好,因为每个粒子都是动态移动的,因此每帧会进行许多计算。
我觉得你的第二个选择会更好,因为没有/很少的处理时间(只需计算“爆炸”的距离并选择适当的帧。但是,也有一个权衡,即所有爆炸看起来都非常相似。如果您可以发布一些代码(您使用了多少粒子,爆炸发生的频率,大约同时发生的爆炸数量),那将会很有帮助。不久前我遇到了类似的问题,但问题要简单得多粒子效果,我通过渲染一个粒子效果并将其移动到每帧显示的任何地方来解决这个问题
编辑 1: 好的,所以我认为您正在寻找的是粒子效果池。您基本上预先分配了一定数量的粒子效果,而不是像我相信您可能那样根据需要创建它们。通过重用固定池中的对象而不是单独分配和释放它们,您可以节省大量内存和处理量。我尝试了我相信你在我的 Desire HD 上所做的事情,并在屏幕上同时获得了大约 22 fps 和 12、1 秒 100 个奇怪的粒子效果。然后把它们集中起来,我得到了大约 25 个。虽然不是特别好,但每一点都有帮助。此外,将粒子数减少到 75% 左右也不是那么明显,并且可以节省大量帧!
抱歉我无法提供更多帮助!
| 归档时间: |
|
| 查看次数: |
2231 次 |
| 最近记录: |