我正在制作一个使用粒子效果进行爆炸的libGDX游戏。这在新手机上运行得相当不错,但在老款手机上(在HTC Desire上测试),当屏幕上有多个爆炸时fps显着滞后。
我目前正在考虑两种选择:
每个效果都有很多粒子,因此减少这个数量可能是一种选择,但我不愿意因为一致性和美学原因。
使用通过运行粒子效果生成的动画并保存每个帧。这看起来不错,而且会保持一致。图像大小可能存在问题。我也看不出如何使用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:这些效果是附加的,所以也有很多混合。
答案 0 :(得分:3)
看看你的两个想法,他们都会工作。 第一种方法可以通过使颗粒稍大一些并使用较少的颗粒来解决。随着每个粒子动态移动,手机必须处理的粒子越少,因此每帧的许多计算都会打勾。
我认为你的第二个选择会更好,因为没有/很少的处理时间(只需计算它的“爆炸”程度并选择合适的框架。但是还有一个权衡,你所有的爆炸将会看起来非常相似。如果你可以发布你的一些代码(你正在使用的粒子数量,发生爆炸的次数,大致同时发生多少次爆炸)会有所帮助。我有一段时间有类似的问题,但是一个更简单的粒子效果,我通过渲染一个粒子效果并将其移动到每个帧显示的所有位置来解决它
编辑1: 好吧,所以我认为你在寻找的是粒子特效池。你基本上预先分配了一定数量的粒子效果,而不是像我认为的那样根据需要创建它们。通过重用固定池中的对象而不是单独分配和释放它们,可以节省大量内存和处理。我尝试了我相信你在我的Desire HD上完成的工作,并且在屏幕上同时获得了大约22 fps的12秒,1秒100个奇怪的粒子效果。然后合并它们我得到了大约25个。它并不是非常令人震惊的好,但每一点都有帮助。将颗粒数量减少到约75%并不是那么明显,可以为您节省大量的框架!
Particle Effect Pool Libgdx JavaDoc
抱歉,我忍不住多了!