2013-02-18 66 views
0

我有大约500个vec4需要可用,但每个对象只有〜15个,并且为了下一个要绘制的对象而将其更改为其他15个其他对象,等等。Android openGl ES 2.0快速统一更改

起初我试图在“统一的vec4行[500]”中存储所有的数据,这在一些设备上运行良好,但是例如在Galaxy SII上,这会导致即时崩溃,并带有outOfMemory异常。 比我想那些需要15复制为每个对象的形式CPU端使用到GPU:

GLES20.glUniform4f(GLES20.glGetformLocation(programHandle, "lines["+i/4+"]"), 
     lines[i], lines[i+1], lines[i+2], lines[i+3]); 

,因为有相当一些物体被吸入这导致vec4的的很多传递到GPU,为垃圾收集器每2秒调用一次。

“lines”是一个float [4 * lineCount],也许一个上传整个float []的调用会更快&已经有更高的内存效率,有谁知道该怎么做?

我相信UBO's会很适合这个问题,但是他们不能用在android上吗?

有没有人知道更好的解决方案呢?非常感谢!

GALAXY SII的用户依赖于你^ _^

+0

为什么不能只需使用属性阵列? – Kimi 2013-02-18 16:14:13

+0

这15个vec4的需要是相同的约1000个顶点绘制(一个部分圆)和超过15个新的vec4的未来1000个顶点,所以使用属性数组将会更加昂贵我想,如果你认为否则我会尝试它这种方式,或者如果你知道一种方法来存储500个vec4的一次在GPU内存,而不是部分地访问他们,以放入一个很好的制服。 – 2013-02-18 17:35:44

回答

0

如果你能使用OpenGL ES3.0,那么你就可以Uniform Buffers支持ES3.0应该支持UBOs。任何Android设备上运行。

0

有几件事会在这里:

  • 你必须重新考虑你的解决方案,如果你正在因为OpenGL技术的垃圾收集器运行。它可能会导致你的帧率不一致。

  • 在我看来,你可能会混淆属性数组和制服。属性数组是这里的解决方案,因为您希望将每帧必须移动到GPU的数据量最小化。

  • 统一缓冲对象不支持GALAXY SII,它只是有OpenGL ES2.0

    • 如果你真的想用一个统一的大数据集,唯一的办法会是使用该纹理。 (但是这真的不是在这种情况下建议。)