【问题标题】:Simple particle system on Android using OpenGL ES 1.0Android 上使用 OpenGL ES 1.0 的简单粒子系统
【发布时间】:2011-06-30 11:24:36
【问题描述】:

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

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

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

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

(在 1ghz 机器上使用 200 个左右的粒子,内存为兆。这比我 20 年前在 7mhz 机器上使用

【问题讨论】:

    标签: android optimization opengl-es particles


    【解决方案1】:

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

    我找到了this thread on gamedev.stackexchange.com(不是特定于 Android 的),没有人可以就那里的最佳方法达成一致,但您可能想尝试一些事情并亲自看看。

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

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

    【讨论】:

    • 感谢您的链接。 glDrawArrays(GL_POINTS) 上面已经描述过了。我刚刚尝试了 GL_TRIANGLE_STRIP 和 2 个三角形,它的速度要快一些(假设我的时间准确,可能会达到 5-10%)。我尝试使用一个三角形(GL_TRIANGLES),但它闪烁并且似乎没有更快。 GL_LINES 没有帮助。这很令人沮丧,因为我可以在没有减速的情况下处理静态数组中的数千个点,但是几十个动态点(四边形)完全杀死了它。我怀疑我可以不写屏幕大小的位图,每帧将其转换为纹理并显示它。
    • 在搜索和试验之后,我似乎别无选择,只能安装 NDK 并在 C++ 中进行。很明显,我的手机通过一个 glDrawArrays 调用渲染数千个点图没有问题,但是对 DrawArrays 的多次调用(每个点一次调用)对于超过 20 或 30 个点来说速度不够快。从 Java 更改顶点缓冲区也太慢了,所以我的第一项工作是从 C++ 操作它。在那里使用三角形条带(每个点 2 个三角形)可能会更快,就像我目前拨打多个电话时一样,所以我也必须计时。
    • 最终使用了 NDK,并且浮动而不是定点。这个页面很有帮助(badlogicgames.com/wiki/index.php/…)。他们声称将 put 与 ints 一起使用很慢,因为存在错误,并且它将在 Android 3.0 中修复,但使用浮点数的替代方法仍然比他们的本机解决方案加载慢(C 中的单个 memcpy,这就是我做..好吧,两个memcpys ...)那么谁在乎他们是否修复它?!我仍然使用积分;使用单独的 OpenGL 调用来绘制四边形的开销比单独调用来绘制数百个点要慢。
    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 2011-06-09
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多