在 Android 中使用带有 OpenGL ES 的 VBO 性能不佳

Posted

技术标签:

【中文标题】在 Android 中使用带有 OpenGL ES 的 VBO 性能不佳【英文标题】:Bad performance using VBO with OpenGL ES in Android 【发布时间】:2015-04-30 19:28:19 【问题描述】:

我正在制作一个 Android 应用程序,我需要使用 OpenGL ES 绘制一些形状。我能够渲染它们,但我对性能感到失望。我更新了代码以使用 VBO 但我没有注意到任何改进。我想以每秒 60 帧(每帧 16 毫秒)进行渲染。

我有一个测试项目,我在屏幕上渲染了几个三角形。当我渲染 1000 个三角形时,每帧大约需要 20 毫秒(取决于设备)。

我想让渲染保持在 10 毫秒,因为我需要剩下的(6 毫秒)来执行其他计算(例如更新位置、检测碰撞等) .

这是我渲染三角形的代码:

https://github.com/mauriciotogneri/test/blob/master/src/com/testopengl/Polygon.java#L51-66

这是迭代三角形的代码:

https://github.com/mauriciotogneri/test/blob/master/src/com/testopengl/MapRenderer.java#L117-139

(更改 NUMBER_OF_TRIANGLES 的值以显示更多三角形)

据我了解,如果我需要每帧调用 1000 次(每个三角形一个)。

有没有其他方法可以渲染几个多边形而不需要太多?

注意事项:

在示例中,所有三角形在屏幕上都有固定位置,但在实际场景中它们会四处移动 在示例中,我为每个三角形分配了一个随机颜色,但在实际场景中,每个三角形都有一个固定颜色

【问题讨论】:

尽量减少您的 OpenGLES 调用 - 即对包含多个多边形的 10000 个三角形调用一次 glDrawArrays。 如果所有多边形都具有不同的形状并在不同的位置和不同的颜色呈现,我如何才能最大限度地减少对 glDrawArrays 的调用量?谢谢 【参考方案1】:

将您的位置/颜色/法线...放在一个 VBO 对象中,并在一次调用中绘制它们。

【讨论】:

这里有一个例子会有所帮助

以上是关于在 Android 中使用带有 OpenGL ES 的 VBO 性能不佳的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在带有 Java 的 Android 的 OpenGL ES 2.0 中使用顶点缓冲区中的对象?

在android opengl es中检测面向相机的立方体的一侧

Android 上的 openGl es 在右上角显示一个 Square

OpenGL ES在android上画一个正方形

如何在Android上使用OpenGL ES 2.0绘制点

android openGL ES2 一切从绘制纹理開始