在Android上使用OpenGL ES 1.0创建简单的粒子系统

4
我正在尝试在Android上使用OpenGL组合一个粒子系统。我想要几千个粒子,其中大部分可能在任何给定时间都不在屏幕上。它们在视觉上相当简单,并且我的世界是2D的,但它们会移动,改变颜色(不是大小 - 它们是2x2),并且我需要能够添加和删除它们。
我目前有一个数组,我通过迭代处理速度变化、管理生命周期(杀死旧的,添加新的)和绘制它们,使用glDrawArrays。然而,对于这个调用,OpenGl指向的是一个单独的顶点;我将其glTranslatex到每个我想要绘制的粒子的相关坐标上,一次一个,使用glColor4x设置颜色,然后glDrawArrays它。它工作正常,但速度有点慢,只适用于几百个粒子。我自己处理剪辑。
我编写了一个支持静态粒子的系统,我已经将其加载到一个顶点/颜色数组中,并使用glDrawArrays绘制,但这种方法似乎只适用于永远不会改变相对位置(即我使用glTranslate移动所有粒子),颜色以及我不需要添加/删除粒子的粒子。我的手机(HTC Desire)上的一些测试表明,尝试更改那些数组(它们是由OpenGL指向的ByteBuffer)的内容非常慢。
也许有一种方法可以手动使用CPU自己编写屏幕。如果我只是在屏幕上绘制1x1/2x2的点,并且我只对编写感兴趣而不进行任何混合/抗锯齿,这是一个选项吗?比OpenGL正在做的任何事情都要快吗?
(200个左右的粒子在1ghz的机器上,带着几兆内存。这比20年前在7mhz的机器上获得的速度要慢得多,内存少于500k!我知道我在这里使用Java,但肯定有更好的解决方案。我必须使用NDK来获得C ++的能力,还是我所追求的可能?)
1个回答

0

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

我在gamedev.stackexchange.com(不是针对Android的)上找到了一些信息,但那里的人们无法就最佳方法达成一致,但你可能想尝试一些方法并自行判断。

我原本想建议使用glDrawArrays(GL_POINTS, ...)和glPointSize(),但那里提问的人似乎对此不满意。

如果你找到了一个好的解决方案,请告诉我们!


谢谢提供的链接。glDrawArrays(GL_POINTS)已经被描述过了。我刚刚尝试了GL_TRIANGLE_STRIP和2个三角形,速度稍微快了一点(假设我的计时准确,大约5-10%)。我尝试使用一个三角形(GL_TRIANGLES),但它闪烁并且似乎没有更快。GL_LINES也没有帮助。这很令人沮丧,因为我可以处理静态数组中的数千个点而不会减慢速度,但是几十个动态点(四边形)完全使其崩溃。我怀疑我不能通过编写屏幕大小的位图,每帧将其转换为纹理并显示它来解决问题。 - user146043
经过搜索和尝试,似乎我别无选择,只能安装NDK并使用C++来完成它。很明显,我的手机通过单个glDrawArrays调用渲染成千上万的点精灵没有问题,但是对于超过20或30个点的多次DrawArrays调用速度太慢了。从Java更改顶点缓冲区也太慢了,因此我的第一项工作将是从C++中操作它。在那里使用三角形条带(每个点2个三角形)可能仍然更快,就像我目前进行多次调用时一样,因此我还需要计时。 - user146043
1
最终采用了NDK和浮点数代替固定点。这个页面很有帮助(http://www.badlogicgames.com/wiki/index.php/Direct_Bulk_FloatBuffer.put_is_slow)。他们声称使用int的put很慢因为有一个bug,而且在Android 3.0中将会修复,但是使用浮点数的替代方案仍然比它们的本地解决方案慢得多(单个C语言memcpy执行的两次memcpy),所以谁关心他们是否修复了呢?我仍然使用points;使用单独的OpenGL调用来绘制四边形的开销远远大于使用单个调用来绘制数百个点。 - user146043

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接