java - Libgdx:绘制大量粒子

标签 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;
        }
    }
}

这是我的粒子类:

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();
}

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

我还遇到了 LibGDX 的粒子系统,但它的工作方式与我的工作方式没有什么不同。

最佳答案

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

如果您不想获得那种效果并希望使用大量粒子,您可能不希望在 Java 中执行如此大量的计算。而是使用 NDK 并通过 C/C++ 计算值。

关于java - Libgdx:绘制大量粒子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46699456/

相关文章:

android - 通过构造函数将参数传递给 SurfaceView

java - 升级装配条件后,getStartOffset 返回 Assets 文件夹中文件的错误值

android - 任务 ':android:transformClassesWithJarMergingForRelease'的执行失败

android - 如何将已完成的 libgdx 游戏从 Android 移植到 iOS

java.lang.ClassNotFoundException : org. springframework.boot.SpringApplication Maven

java - 如何在低优先级的 Android/Java 上执行 Linux 命令?

java - 如何将数据插入firebase,但在admin app批准后会显示?

android - 找不到从方法 XXX.<YYY> 引用的类 XXX

java - 访问 DefaultListModel 的索引时出现空指针异常

java - NatTable 布局格式