我已经有一段时间对OpenGL进行编程了,但我对OpenGL ES很新。我遇到的一个问题是以高效的方式在屏幕上绘制基元。
我需要在屏幕上绘制一些相等的线路循环(使用不同的转换),并注意到此代码的性能下降:
gl.glColor4f(0.5f, 0.5f, 0.5f, 1.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, this.vertices);
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
gl.glPushMatrix();
gl.glTranslatef(i, j, 0);
gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);
gl.glPopMatrix();
}
}
我认为 glDrawArrays 在这里是坏人。
所以问题是如何有效地绘制一堆线路循环?使用GL_LINE_LOOP时,必须为每个基元调用glDrawArrays,所以是否需要将类型更改为GL_LINES?这会产生巨大的内存浪费,因为顶点数组(在上面的代码中,保存4个顶点)将保持 width * height * 8 顶点。
我正在为Android OpenGL ES 1.1编程。
答案 0 :(得分:1)
我认为glDrawArrays在这里是坏人。
坏人就是你,使用你的函数调用/上下文切换预算效率低下。将所有行包装成一个数组(如GL_LINES),并通过一次调用将其发送到GPU。不,你不浪费记忆,因为你不能分配不到一页(通常是4kiB)。
答案 1 :(得分:1)
我认为glDrawArrays在这里是坏人。
是和否。你说DrawArrays不是一个快速调用你是正确的,但如果你不经常调用它,它是渲染东西的最快方法。
所以我需要将类型更改为GL_LINES吗?
是的,这样你就可以通过一次平局调用来绘制所有内容
这会造成巨大的内存浪费,因为顶点数组(在上面的代码中,保存4个顶点)将保持宽度*高度* 8个顶点。
与4个顶点相比,我猜你可以把它看作是一个记忆浪费。但GPU是内置一次渲染大批量,它会讨厌你抽出很多小批量。
此外,你应该有足够的内存来容纳顶点,这应该不是问题。