gpt4 book ai didi

java - Libgdx:绘制大量粒子

转载 作者:行者123 更新时间:2023-12-02 02:33:50 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com