4

我正在尝试使用 OpenGL 在 Android 中将粒子系统放在一起。我想要几千个粒子,其中大部分可能在任何给定时间都在屏幕外。它们在视觉上是相当简单的粒子,我的世界是 2D 的,但它们会移动,改变颜色(不是大小 - 它们是 2x2),然后我需要能够添加和删除。

我目前有一个数组,我遍历它,处理速度变化,管理生命周期(杀死旧的,添加新的),并使用 glDrawArrays 绘制它们。然而,对于这个调用,OpenGL 指向的是单个顶点。我将它glTranslatex到我想要绘制的每个粒子的相关坐标,一次一个,用glColor4x设置颜色,然后用glDrawArrays它。它可以工作,但它有点慢,只适用于几百个粒子。我自己处理剪辑。

我编写了一个系统来支持我已加载到顶点/颜色数组并使用 glDrawArrays 绘制的静态粒子,但这种方法似乎只适用于永远不会改变相对位置的粒子(即我使用 glTranslate 移动所有粒子),颜色以及我不需要添加/删除粒子的地方。在我的手机 (HTC Desire) 上进行的一些测试表明,尝试更改这些数组(由 OpenGL 指向的 ByteBuffers)的内容非常缓慢。

也许有一些方法可以自己用 CPU 手动编写屏幕。如果我只是在屏幕上绘制 1x1/2x2 点,而我只是对写作感兴趣而不做任何混合/抗锯齿,这是一个选择吗?它会比 OpenGL 正在做的任何事情都快吗?

(在 1ghz 机器上使用 200 个左右的粒子,内存为兆。这比我 20 年前在 7mhz 机器上使用 <500k 内存的速度要慢得多!我很感激我在这里使用 Java,但肯定有一个更好的解决方案。我是否必须使用 NDK 来获得 C++ 的强大功能,或者是我所追求的)

4

1 回答 1

0

我一直希望有人能明确回答这个问题,因为我自己需要 Android 上的粒子。(不过,我正在使用 C++——目前使用 glDrawArrays(),但还没有将粒子推到极限。)

我发现在 gamedev.stackexchange.com 上找到了这个帖子(不是特定于 Android 的),没有人能就那里的最佳方法达成一致,但您可能想尝试一些事情并自己看看。

我本来打算用 glPointSize() 来建议 glDrawArrays(GL_POINTS, ...),但是问这个问题的人似乎对此不满意。

如果您找到好的解决方案,请告诉我们!

于 2011-02-21T10:29:15.660 回答