Libgdx:绘制大量粒子

时间:2017-10-12 00:17:06

标签: java android libgdx particle-system

在LibGDX中绘制大量在背景中移动的粒子(圆圈)的最佳方法是什么? 在我的应用程序中可以获得200个在后台运行的粒子。以上任何内容都会让我的应用程序口吃。我实际上测试了一个应用程序,它可以在后台运行多达200.000个粒子,而不必牺牲fps。这是我的游戏课程:

public Array<Particles> particlesArray;
SpriteBatch batch;
OrthographicCamera camera;
Texture sParticlesTexture;

public void create(){
    camera = new OrthographicCamera();
    camera.setToOrtho(false, 1080, 1920);
    batch = new SpriteBatch;

    Pixmap pixmap = new Pixmap(Particles.MAX_PARTICLE_RADIUS*2, Particles.MAX_PARTICLE_RADIUS*2, Pixmap.Format.RGBA4444);
    pixmap.setColor(Color.WHITE);
    pixmap.fillCircle(pixmap.getWidth() / 2, pixmap.getHeight() / 2, Particles.MAX_PARTICLE_RADIUS);
    sParticlesTexture = new Texture(pixmap);
    pixmap.dispose();

    size = random(2, Particles.MAX_PARTICLE_RADIUS+1);

    for(int i=0; i<200; i++){
        particlesArray.add(new Particles(random(size, width-size),
            random(0, height),
            0,
            random(0.15f*height, 0.25f*height)*0.15f*size,
            size));
    }

public void render(float deltaTime){
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    //update camera and draw in camera
    camera.update();
    batch.setProjectionMatrix(camera.combined);

    batch.begin();
    drawFallingObjects(particlesArray, batch);
    batch.end()

    moveParticles(particlesArray, deltaTime);
}

public <T extends Objects> void drawFallingObjects(Array<T> objects, SpriteBatch batch){
    for(T item: objects){
        item.draw(batch);
    }
}

public void moveParticles(Array<Particles> particlesArray, float deltaTime){
    for(Particles item: particlesArray){
        size = random(2, Particles.MAX_PARTICLE_RADIUS+1);
        item.move(deltaTime);
        //creating particles if out of scale
        if(item.y+item.mDiameter<0){
            item.x = random(size, width-size);
            item.y = height+20;
            item.vy = random(0.15f*height, 0.25f*height)*0.15f*size;
            item.mDiameter = size;
        }
    }
}

这是我的Particles课程:

import com....sParticlesTexture;
public class Particles{

public static int MAX_PARTICLE_RADIUS = 4;

public Particles(float x, float y, float vx, float vy, float mDiameter){
    super(x, y, vx, vy, mDiameter);
    radius = mDiameter/2;
}

@Override
public void draw(SpriteBatch batch){
    batch.draw(sParticlesTexture, x-radius, y-radius, mDiameter, mDiameter);
}

@Override
public void move(float deltaTime){
    y -= ceil(vy*deltaTime);
    x += ceil(vx*deltaTime);
}

public void dispose() {
    sParticlesTexture.dispose();
}

所有粒子对象都使用同一个纹理。这改善了很多,而不是创建一百个不同的纹理。那么现在可以做些什么呢?我google了很多。在我的情况下会有什么帮助?帧缓冲,着色器?我应该如何在游戏中实现这些? CPUSpriteBatch怎么样?

我也从LibGDX中发现了粒子系统,但它与我的工作方式不同。

2 个答案:

答案 0 :(得分:1)

首先看一下效率更高的粒子效果。 https://github.com/libgdx/libgdx/wiki/2D-ParticleEffects

如果您没有尝试获得这种效果并且想要使用大量粒子,那么您可能不希望在Java中执行如此大量的计算。而是使用NDK并计算C / C ++中的值。

答案 1 :(得分:1)

As Nabin said, libgdx has a particle system in place already which is already tuned to be efficient. Libgdx also has a tool called the 2D Particle editor which allows you to view and edit particles before you add them to your application. A guide on the Editor can be found on the libgdx site and gamedevelopment.blog.

From the code samples you provided, I think you could also possibly use a shader to create the same effect. The bonus to this is its all done on the GPU. Some example shaders can be found on Shadertoy and guide on shaders from GamesFromScratch or GLSL Shader Tutorial for Libgdx

相关问题